You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

510 lines
22 KiB

2 years ago
  1. /**
  2. * Example is implemented from here https://www.w3resource.com/sqlite/exists-operator.php
  3. */
  4. #include <sqlite_orm/sqlite_orm.h>
  5. #include <string>
  6. #include <iostream>
  7. using std::cout;
  8. using std::endl;
  9. struct Customer {
  10. std::string code;
  11. std::string name;
  12. std::string city;
  13. std::string workingArea;
  14. std::string country;
  15. int grade;
  16. double openingAmt;
  17. double receiveAmt;
  18. double paymentAmt;
  19. double outstandingAmt;
  20. std::string phoneNo;
  21. std::string agentCode;
  22. };
  23. struct Agent {
  24. std::string code;
  25. std::string name;
  26. std::string workingArea;
  27. double comission;
  28. std::string phoneNo;
  29. std::string country;
  30. };
  31. struct Order {
  32. std::string num;
  33. int amount;
  34. int advanceAmount;
  35. std::string date;
  36. std::string custCode;
  37. std::string agentCode;
  38. };
  39. int main(int, char**) {
  40. using namespace sqlite_orm;
  41. auto storage = make_storage("exists.sqlite",
  42. make_table("customer",
  43. make_column("CUST_CODE", &Customer::code, primary_key()),
  44. make_column("CUST_NAME", &Customer::name),
  45. make_column("CUST_CITY", &Customer::city),
  46. make_column("WORKING_AREA", &Customer::workingArea),
  47. make_column("CUST_COUNTRY", &Customer::country),
  48. make_column("GRADE", &Customer::grade),
  49. make_column("OPENING_AMT", &Customer::openingAmt),
  50. make_column("RECEIVE_AMT", &Customer::receiveAmt),
  51. make_column("PAYMENT_AMT", &Customer::paymentAmt),
  52. make_column("OUTSTANDING_AMT", &Customer::outstandingAmt),
  53. make_column("PHONE_NO", &Customer::phoneNo),
  54. make_column("AGENT_CODE", &Customer::agentCode)),
  55. make_table("agents",
  56. make_column("AGENT_CODE", &Agent::code, primary_key()),
  57. make_column("AGENT_NAME", &Agent::name),
  58. make_column("WORKING_AREA", &Agent::workingArea),
  59. make_column("COMMISSION", &Agent::comission),
  60. make_column("PHONE_NO", &Agent::phoneNo),
  61. make_column("COUNTRY", &Agent::country)),
  62. make_table("orders",
  63. make_column("ORD_NUM", &Order::num, primary_key()),
  64. make_column("ORD_AMOUNT", &Order::amount),
  65. make_column("ADVANCE_AMOUNT", &Order::advanceAmount),
  66. make_column("ORD_DATE", &Order::date),
  67. make_column("CUST_CODE", &Order::custCode),
  68. make_column("AGENT_CODE", &Order::agentCode)));
  69. storage.sync_schema();
  70. storage.remove_all<Order>();
  71. storage.remove_all<Agent>();
  72. storage.remove_all<Customer>();
  73. storage.replace(Agent{"A007", "Ramasundar", "Bangalore", 0.15, "077-25814763", ""});
  74. storage.replace(Agent{"A003", "Alex", "London", 0.13, "075-12458969", ""});
  75. storage.replace(Agent{"A008", "Alford", "New York", 0.12, "044-25874365", ""});
  76. storage.replace(Agent{"A011", "Ravi Kumar", "Bangalore", 0.15, "077-45625874", ""});
  77. storage.replace(Agent{"A010", "Santakumar", "Chennai", 0.14, "007-22388644", ""});
  78. storage.replace(Agent{"A012", "Lucida", "San Jose", 0.12, "044-52981425", ""});
  79. storage.replace(Agent{"A005", "Anderson", "Brisban", 0.13, "045-21447739", ""});
  80. storage.replace(Agent{"A001", "Subbarao", "Bangalore", 0.14, "077-12346674", ""});
  81. storage.replace(Agent{"A002", "Mukesh", "Mumbai", 0.11, "029-12358964", ""});
  82. storage.replace(Agent{"A006", "McDen", "London", 0.15, "078-22255588", ""});
  83. storage.replace(Agent{"A004", "Ivan", "Torento", 0.15, "008-22544166", ""});
  84. storage.replace(Agent{"A009", "Benjamin", "Hampshair", 0.11, "008-22536178", ""});
  85. storage.replace(Customer{"C00013",
  86. "Holmes",
  87. "London",
  88. "London",
  89. "UK",
  90. 2,
  91. 6000.00,
  92. 5000.00,
  93. 7000.00,
  94. 4000.00,
  95. "BBBBBBB",
  96. "A003"});
  97. storage.replace(Customer{"C00001",
  98. "Micheal",
  99. "New York",
  100. "New York",
  101. "USA",
  102. 2,
  103. 3000.00,
  104. 5000.00,
  105. 2000.00,
  106. 6000.00,
  107. "CCCCCCC",
  108. "A008"});
  109. storage.replace(Customer{"C00020",
  110. "Albert",
  111. "New York",
  112. "New York",
  113. "USA",
  114. 3,
  115. 5000.00,
  116. 7000.00,
  117. 6000.00,
  118. 6000.00,
  119. "BBBBSBB",
  120. "A008"});
  121. storage.replace(Customer{"C00025",
  122. "Ravindran",
  123. "Bangalore",
  124. "Bangalore",
  125. "India",
  126. 2,
  127. 5000.00,
  128. 7000.00,
  129. 4000.00,
  130. 8000.00,
  131. "AVAVAVA",
  132. "A011"});
  133. storage.replace(
  134. Customer{"C00024", "Cook", "London", "London", "UK", 2, 4000.00, 9000.00, 7000.00, 6000.00, "FSDDSDF", "A006"});
  135. storage.replace(Customer{"C00015",
  136. "Stuart",
  137. "London",
  138. "London",
  139. "UK",
  140. 1,
  141. 6000.00,
  142. 8000.00,
  143. 3000.00,
  144. 11000.00,
  145. "GFSGERS",
  146. "A003"});
  147. storage.replace(Customer{"C00002",
  148. "Bolt",
  149. "New York",
  150. "New York",
  151. "USA",
  152. 3,
  153. 5000.00,
  154. 7000.00,
  155. 9000.00,
  156. 3000.00,
  157. "DDNRDRH",
  158. "A008"});
  159. storage.replace(Customer{"C00018",
  160. "Fleming",
  161. "Brisban",
  162. "Brisban",
  163. "Australia",
  164. 2,
  165. 7000.00,
  166. 7000.00,
  167. 9000.00,
  168. 5000.00,
  169. "NHBGVFC",
  170. "A005"});
  171. storage.replace(Customer{"C00021",
  172. "Jacks",
  173. "Brisban",
  174. "Brisban",
  175. "Australia",
  176. 1,
  177. 7000.00,
  178. 7000.00,
  179. 7000.00,
  180. 7000.00,
  181. "WERTGDF",
  182. "A005"});
  183. storage.replace(Customer{"C00019",
  184. "Yearannaidu",
  185. "Chennai",
  186. "Chennai",
  187. "India",
  188. 1,
  189. 8000.00,
  190. 7000.00,
  191. 7000.00,
  192. 8000.00,
  193. "ZZZZBFV",
  194. "A010"});
  195. storage.replace(Customer{"C00005",
  196. "Sasikant",
  197. "Mumbai",
  198. "Mumbai",
  199. "India",
  200. 1,
  201. 7000.00,
  202. 11000.00,
  203. 7000.00,
  204. 11000.00,
  205. "147-25896312",
  206. "A002"});
  207. storage.replace(Customer{"C00007",
  208. "Ramanathan",
  209. "Chennai",
  210. "Chennai",
  211. "India",
  212. 1,
  213. 7000.00,
  214. 11000.00,
  215. 9000.00,
  216. 9000.00,
  217. "GHRDWSD",
  218. "A010"});
  219. storage.replace(Customer{"C00022",
  220. "Avinash",
  221. "Mumbai",
  222. "Mumbai",
  223. "India",
  224. 2,
  225. 7000.00,
  226. 11000.00,
  227. 9000.00,
  228. 9000.00,
  229. "113-12345678",
  230. "A002"});
  231. storage.replace(Customer{"C00004",
  232. "Winston",
  233. "Brisban",
  234. "Brisban",
  235. "Australia",
  236. 1,
  237. 5000.00,
  238. 8000.00,
  239. 7000.00,
  240. 6000.00,
  241. "AAAAAAA",
  242. "A005"});
  243. storage.replace(
  244. Customer{"C00023", "Karl", "London", "London", "UK", 0, 4000.00, 6000.00, 7000.00, 3000.00, "AAAABAA", "A006"});
  245. storage.replace(Customer{"C00006",
  246. "Shilton",
  247. "Torento",
  248. "Torento",
  249. "Canada",
  250. 1,
  251. 10000.00,
  252. 7000.00,
  253. 6000.00,
  254. 11000.00,
  255. "DDDDDDD",
  256. "A004"});
  257. storage.replace(Customer{"C00010",
  258. "Charles",
  259. "Hampshair",
  260. "Hampshair",
  261. "UK",
  262. 3,
  263. 6000.00,
  264. 4000.00,
  265. 5000.00,
  266. 5000.00,
  267. "MMMMMMM",
  268. "A009"});
  269. storage.replace(Customer{"C00017",
  270. "Srinivas",
  271. "Bangalore",
  272. "Bangalore",
  273. "India",
  274. 2,
  275. 8000.00,
  276. 4000.00,
  277. 3000.00,
  278. 9000.00,
  279. "AAAAAAB",
  280. "A007"});
  281. storage.replace(Customer{"C00012",
  282. "Steven",
  283. "San Jose",
  284. "San Jose",
  285. "USA",
  286. 1,
  287. 5000.00,
  288. 7000.00,
  289. 9000.00,
  290. 3000.00,
  291. "KRFYGJK",
  292. "A012"});
  293. storage.replace(Customer{"C00008",
  294. "Karolina",
  295. "Torento",
  296. "Torento",
  297. "Canada",
  298. 1,
  299. 7000.00,
  300. 7000.00,
  301. 9000.00,
  302. 5000.00,
  303. "HJKORED",
  304. "A004"});
  305. storage.replace(Customer{"C00003",
  306. "Martin",
  307. "Torento",
  308. "Torento",
  309. "Canada",
  310. 2,
  311. 8000.00,
  312. 7000.00,
  313. 7000.00,
  314. 8000.00,
  315. "MJYURFD",
  316. "A004"});
  317. storage.replace(Customer{"C00009",
  318. "Ramesh",
  319. "Mumbai",
  320. "Mumbai",
  321. "India",
  322. 3,
  323. 8000.00,
  324. 7000.00,
  325. 3000.00,
  326. 12000.00,
  327. "Phone No",
  328. "A002"});
  329. storage.replace(Customer{"C00014",
  330. "Rangarappa",
  331. "Bangalore",
  332. "Bangalore",
  333. "India",
  334. 2,
  335. 8000.00,
  336. 11000.00,
  337. 7000.00,
  338. 12000.00,
  339. "AAAATGF",
  340. "A001"});
  341. storage.replace(Customer{"C00016",
  342. "Venkatpati",
  343. "Bangalore",
  344. "Bangalore",
  345. "India",
  346. 2,
  347. 8000.00,
  348. 11000.00,
  349. 7000.00,
  350. 12000.00,
  351. "JRTVFDD",
  352. "A007"});
  353. storage.replace(Customer{"C00011",
  354. "Sundariya",
  355. "Chennai",
  356. "Chennai",
  357. "India",
  358. 3,
  359. 7000.00,
  360. 11000.00,
  361. 7000.00,
  362. 11000.00,
  363. "PPHGRTS",
  364. "A010"});
  365. storage.replace(Order{"200114", 3500, 2000, "15-AUG-08", "C00002", "A008"});
  366. storage.replace(Order{"200122", 2500, 400, "16-SEP-08", "C00003", "A004"});
  367. storage.replace(Order{"200118", 500, 100, "20-JUL-08", "C00023", "A006"});
  368. storage.replace(Order{"200119", 4000, 700, "16-SEP-08", "C00007", "A010"});
  369. storage.replace(Order{"200121", 1500, 600, "23-SEP-08", "C00008", "A004"});
  370. storage.replace(Order{"200130", 2500, 400, "30-JUL-08", "C00025", "A011"});
  371. storage.replace(Order{"200134", 4200, 1800, "25-SEP-08", "C00004", "A005"});
  372. storage.replace(Order{"200108", 4000, 600, "15-FEB-08", "C00008", "A004"});
  373. storage.replace(Order{"200103", 1500, 700, "15-MAY-08", "C00021", "A005"});
  374. storage.replace(Order{"200105", 2500, 500, "18-JUL-08", "C00025", "A011"});
  375. storage.replace(Order{"200109", 3500, 800, "30-JUL-08", "C00011", "A010"});
  376. storage.replace(Order{"200101", 3000, 1000, "15-JUL-08", "C00001", "A008"});
  377. storage.replace(Order{"200111", 1000, 300, "10-JUL-08", "C00020", "A008"});
  378. storage.replace(Order{"200104", 1500, 500, "13-MAR-08", "C00006", "A004"});
  379. storage.replace(Order{"200106", 2500, 700, "20-APR-08", "C00005", "A002"});
  380. storage.replace(Order{"200125", 2000, 600, "10-OCT-08", "C00018", "A005"});
  381. storage.replace(Order{"200117", 800, 200, "20-OCT-08", "C00014", "A001"});
  382. storage.replace(Order{"200123", 500, 100, "16-SEP-08", "C00022", "A002"});
  383. storage.replace(Order{"200120", 500, 100, "20-JUL-08", "C00009", "A002"});
  384. storage.replace(Order{"200116", 500, 100, "13-JUL-08", "C00010", "A009"});
  385. storage.replace(Order{"200124", 500, 100, "20-JUN-08", "C00017", "A007"});
  386. storage.replace(Order{"200126", 500, 100, "24-JUN-08", "C00022", "A002"});
  387. storage.replace(Order{"200129", 2500, 500, "20-JUL-08", "C00024", "A006"});
  388. storage.replace(Order{"200127", 2500, 400, "20-JUL-08", "C00015", "A003"});
  389. storage.replace(Order{"200128", 3500, 1500, "20-JUL-08", "C00009", "A002"});
  390. storage.replace(Order{"200135", 2000, 800, "16-SEP-08", "C00007", "A010"});
  391. storage.replace(Order{"200131", 900, 150, "26-AUG-08", "C00012", "A012"});
  392. storage.replace(Order{"200133", 1200, 400, "29-JUN-08", "C00009", "A002"});
  393. storage.replace(Order{"200100", 1000, 600, "08-JAN-08", "C00015", "A003"});
  394. storage.replace(Order{"200110", 3000, 500, "15-APR-08", "C00019", "A010"});
  395. storage.replace(Order{"200107", 4500, 900, "30-AUG-08", "C00007", "A010"});
  396. storage.replace(Order{"200112", 2000, 400, "30-MAY-08", "C00016", "A007"});
  397. storage.replace(Order{"200113", 4000, 600, "10-JUN-08", "C00022", "A002"});
  398. storage.replace(Order{"200102", 2000, 300, "25-MAY-08", "C00012", "A012"});
  399. {
  400. // SELECT agent_code,agent_name,working_area,commission
  401. // FROM agents
  402. // WHERE exists
  403. // (SELECT *
  404. // FROM customer
  405. // WHERE grade=3 AND agents.agent_code=customer.agent_code)
  406. // ORDER BY commission;
  407. auto rows = storage.select(columns(&Agent::code, &Agent::name, &Agent::workingArea, &Agent::comission),
  408. where(exists(select(asterisk<Customer>(),
  409. where(is_equal(&Customer::grade, 3) and
  410. is_equal(&Agent::code, &Customer::agentCode))))),
  411. order_by(&Agent::comission));
  412. cout << "AGENT_CODE AGENT_NAME WORKING_AREA COMMISSION" << endl;
  413. cout << "---------- ---------------------------------------- ------------ ----------" << endl;
  414. for(auto& row: rows) {
  415. cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << '\t' << std::get<3>(row)
  416. << endl;
  417. }
  418. }
  419. {
  420. // SELECT cust_code, cust_name, cust_city, grade
  421. // FROM customer
  422. // WHERE grade=2 AND EXISTS
  423. // (SELECT COUNT(*)
  424. // FROM customer
  425. // WHERE grade=2
  426. // GROUP BY grade
  427. // HAVING COUNT(*)>2);
  428. auto rows = storage.select(columns(&Customer::code, &Customer::name, &Customer::city, &Customer::grade),
  429. where(is_equal(&Customer::grade, 2) and
  430. exists(select(count<Customer>(),
  431. where(is_equal(&Customer::grade, 2)),
  432. group_by(&Customer::grade).having(greater_than(count(), 2))))));
  433. cout << "CUST_CODE CUST_NAME CUST_CITY GRADE" << endl;
  434. cout << "---------- ---------- ----------------------------------- ----------" << endl;
  435. for(auto& row: rows) {
  436. cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << '\t' << std::get<3>(row)
  437. << endl;
  438. }
  439. }
  440. {
  441. // SELECT agent_code,ord_num,ord_amount,cust_code
  442. // FROM orders
  443. // WHERE NOT EXISTS
  444. // (SELECT agent_code
  445. // FROM customer
  446. // WHERE payment_amt=1400);
  447. auto rows = storage.select(
  448. columns(&Order::agentCode, &Order::num, &Order::amount, &Order::custCode),
  449. from<Order>(),
  450. where(not exists(select(&Customer::agentCode, where(is_equal(&Customer::paymentAmt, 1400))))));
  451. cout << "AGENT_CODE ORD_NUM ORD_AMOUNT CUST_CODE" << endl;
  452. for(auto& row: rows) {
  453. cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << '\t' << std::get<3>(row)
  454. << endl;
  455. }
  456. }
  457. {
  458. // SELECT "orders"."AGENT_CODE", "orders"."ORD_NUM", "orders"."ORD_AMOUNT", "orders"."CUST_CODE", 'c'."PAYMENT_AMT"
  459. // FROM 'orders' INNER JOIN 'customer' 'c' ON('c'."AGENT_CODE" = "orders"."AGENT_CODE")
  460. // WHERE(NOT(EXISTS
  461. // (
  462. // SELECT 'd'."AGENT_CODE" FROM 'customer' 'd' WHERE((('c'."PAYMENT_AMT" = 7000) AND('d'."AGENT_CODE" = 'c'."AGENT_CODE")))))
  463. // )
  464. // ORDER BY 'c'."PAYMENT_AMT"
  465. using als = alias_c<Customer>;
  466. using als_2 = alias_d<Customer>;
  467. double amount = 2000;
  468. auto where_clause =
  469. select(alias_column<als_2>(&Customer::agentCode),
  470. from<als_2>(),
  471. where(is_equal(alias_column<als>(&Customer::paymentAmt), std::ref(amount)) and
  472. (alias_column<als_2>(&Customer::agentCode) == c(alias_column<als>(&Customer::agentCode)))));
  473. amount = 7000;
  474. auto statement =
  475. storage.prepare(select(columns(&Order::agentCode,
  476. &Order::num,
  477. &Order::amount,
  478. &Order::custCode,
  479. alias_column<als>(&Customer::paymentAmt)),
  480. from<Order>(),
  481. inner_join<als>(on(alias_column<als>(&Customer::agentCode) == c(&Order::agentCode))),
  482. where(not exists(where_clause)),
  483. order_by(alias_column<als>(&Customer::paymentAmt))));
  484. auto sql = statement.expanded_sql();
  485. auto rows = storage.execute(statement);
  486. cout << endl;
  487. for(auto& row: rows) {
  488. cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << '\t' << std::get<3>(row)
  489. << '\t' << std::get<4>(row) << endl;
  490. }
  491. }
  492. return 0;
  493. }