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.

113 lines
4.4 KiB

2 years ago
  1. /**
  2. * This example was grabbed from here https://www.tutorialspoint.com/sqlite/sqlite_unions_clause.htm
  3. */
  4. #include <sqlite_orm/sqlite_orm.h>
  5. #include <string>
  6. #include <cassert>
  7. #include <algorithm>
  8. #include <iostream>
  9. using std::cout;
  10. using std::endl;
  11. int main() {
  12. struct Employee {
  13. int id;
  14. std::string name;
  15. int age;
  16. std::string address;
  17. double salary;
  18. };
  19. struct Department {
  20. int id;
  21. std::string dept;
  22. int employeeId;
  23. };
  24. using namespace sqlite_orm;
  25. auto storage = make_storage("union.sqlite",
  26. make_table("COMPANY",
  27. make_column("ID", &Employee::id, primary_key()),
  28. make_column("NAME", &Employee::name),
  29. make_column("AGE", &Employee::age),
  30. make_column("ADDRESS", &Employee::address),
  31. make_column("SALARY", &Employee::salary)),
  32. make_table("DEPARTMENT",
  33. make_column("ID", &Department::id, primary_key()),
  34. make_column("DEPT", &Department::dept),
  35. make_column("EMP_ID", &Department::employeeId),
  36. foreign_key(&Department::employeeId).references(&Employee::id)));
  37. storage.sync_schema();
  38. // order matters
  39. storage.remove_all<Department>();
  40. storage.remove_all<Employee>();
  41. storage.replace(Employee{1, "Paul", 32, "California", 20000.0});
  42. storage.replace(Employee{2, "Allen", 25, "Texas", 15000.0});
  43. storage.replace(Employee{3, "Teddy", 23, "Norway", 20000.0});
  44. storage.replace(Employee{4, "Mark", 25, "Rich-Mond", 65000.0});
  45. storage.replace(Employee{5, "David", 27, "Texas", 85000.0});
  46. storage.replace(Employee{6, "Kim", 22, "South-Hall", 45000.0});
  47. storage.replace(Employee{7, "James", 24, "Houston", 10000.0});
  48. storage.replace(Department{1, "IT Billing", 1});
  49. storage.replace(Department{2, "Engineering", 2});
  50. storage.replace(Department{3, "Finance", 7});
  51. storage.replace(Department{4, "Engineering", 3});
  52. storage.replace(Department{5, "Finance", 4});
  53. storage.replace(Department{6, "Engineering", 5});
  54. storage.replace(Department{7, "Finance", 6});
  55. {
  56. // SELECT EMP_ID, NAME, DEPT
  57. // FROM COMPANY
  58. // INNER JOIN DEPARTMENT
  59. // ON COMPANY.ID = DEPARTMENT.EMP_ID
  60. // UNION
  61. // SELECT EMP_ID, NAME, DEPT
  62. // FROM COMPANY
  63. // LEFT OUTER JOIN DEPARTMENT
  64. // ON COMPANY.ID = DEPARTMENT.EMP_ID;
  65. auto rows = storage.select(
  66. union_(select(columns(&Department::employeeId, &Employee::name, &Department::dept),
  67. inner_join<Department>(on(is_equal(&Employee::id, &Department::employeeId)))),
  68. select(columns(&Department::employeeId, &Employee::name, &Department::dept),
  69. left_outer_join<Department>(on(is_equal(&Employee::id, &Department::employeeId))))));
  70. assert(rows.size() == 7);
  71. std::sort(rows.begin(), rows.end(), [](auto& lhs, auto& rhs) {
  72. return std::get<0>(lhs) < std::get<0>(rhs);
  73. });
  74. for(auto& row: rows) {
  75. cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << endl;
  76. }
  77. cout << endl;
  78. }
  79. {
  80. // SELECT EMP_ID, NAME, DEPT
  81. // FROM COMPANY
  82. // INNER JOIN DEPARTMENT
  83. // ON COMPANY.ID = DEPARTMENT.EMP_ID
  84. // UNION ALL
  85. // SELECT EMP_ID, NAME, DEPT
  86. // FROM COMPANY
  87. // LEFT OUTER JOIN DEPARTMENT
  88. // ON COMPANY.ID = DEPARTMENT.EMP_ID;
  89. auto rows = storage.select(
  90. union_all(select(columns(&Department::employeeId, &Employee::name, &Department::dept),
  91. inner_join<Department>(on(is_equal(&Employee::id, &Department::employeeId)))),
  92. select(columns(&Department::employeeId, &Employee::name, &Department::dept),
  93. left_outer_join<Department>(on(is_equal(&Employee::id, &Department::employeeId))))));
  94. for(auto& row: rows) {
  95. cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << endl;
  96. }
  97. cout << endl;
  98. }
  99. return 0;
  100. }