discord-bot/libs/sqlite_orm-1.8.2/examples/subquery.cpp

1389 lines
57 KiB
C++

/**
* Implemented from here https://www.w3resource.com/sqlite/sqlite-subqueries.php
*/
#include <sqlite_orm/sqlite_orm.h>
#include <string>
#include <memory>
#include <iostream>
using std::cout;
using std::endl;
struct Employee {
int id;
std::string firstName;
std::string lastName;
std::string email;
std::string phoneNumber;
std::string hireDate;
std::string jobId;
long salary;
std::unique_ptr<double> commission_pct;
std::unique_ptr<decltype(id)> managerId;
int departmentId;
};
struct Department {
int id;
std::string name;
int managerId;
int locationId;
};
struct JobHistory {
decltype(Employee::id) employeeId;
std::string startDate;
std::string endDate;
decltype(Employee::jobId) jobId;
decltype(Employee::departmentId) departmentId;
};
int main(int, char**) {
using namespace sqlite_orm;
auto storage = make_storage("subquery.sqlite",
make_table("employees",
make_column("EMPLOYEE_ID", &Employee::id, primary_key()),
make_column("FIRST_NAME", &Employee::firstName),
make_column("LAST_NAME", &Employee::lastName),
make_column("EMAIL", &Employee::email),
make_column("PHONE_NUMBER", &Employee::phoneNumber),
make_column("HIRE_DATE", &Employee::hireDate),
make_column("JOB_ID", &Employee::jobId),
make_column("SALARY", &Employee::salary),
make_column("COMMISSION_PCT", &Employee::commission_pct),
make_column("MANAGER_ID", &Employee::managerId),
make_column("DEPARTMENT_ID", &Employee::departmentId)),
make_table("departments",
make_column("DEPARTMENT_ID", &Department::id, primary_key()),
make_column("DEPARTMENT_NAME", &Department::name),
make_column("MANAGER_ID", &Department::managerId),
make_column("LOCATION_ID", &Department::locationId)),
make_table("job_history",
make_column("employee_id", &JobHistory::employeeId),
make_column("start_date", &JobHistory::startDate),
make_column("end_date", &JobHistory::endDate),
make_column("job_id", &JobHistory::jobId),
make_column("department_id", &JobHistory::departmentId)));
storage.sync_schema();
storage.remove_all<Employee>();
storage.replace(
Employee{100, "Steven", "King", "SKING", "515.123.4567", "17-Jun-87", "AD_PRES", 24000, {}, {}, 90});
storage.replace(Employee{101,
"Neena",
"Kochhar",
"NKOCHHAR",
"515.123.4568",
"21-Sep-89",
"AD_VP",
17000,
{},
std::make_unique<int>(100),
90});
storage.replace(Employee{102,
"Lex",
"De Haan",
"LDEHAAN",
"515.123.4569",
"13-Jan-93",
"AD_VP",
17000,
{},
std::make_unique<int>(100),
90});
storage.replace(Employee{103,
"Alexander",
"Hunold",
"AHUNOLD",
"590.423.4567",
"3-Jan-90",
"IT_PROG",
9000,
{},
std::make_unique<int>(102),
60});
storage.replace(Employee{104,
"Bruce",
"Ernst",
"BERNST",
"590.423.4568",
"21-May-91",
"IT_PROG",
6000,
{},
std::make_unique<int>(103),
60});
storage.replace(Employee{105,
"David",
"Austin",
"DAUSTIN",
"590.423.4569",
"25-Jun-97",
"IT_PROG",
4800,
{},
std::make_unique<int>(103),
60});
storage.replace(Employee{106,
"Valli",
"Pataballa",
"VPATABAL",
"590.423.4560",
"5-Feb-98",
"IT_PROG",
4800,
{},
std::make_unique<int>(103),
60});
storage.replace(Employee{107,
"Diana",
"Lorentz",
"DLORENTZ",
"590.423.5567",
"7-Feb-99",
"IT_PROG",
4200,
{},
std::make_unique<int>(103),
60});
storage.replace(Employee{108,
"Nancy",
"Greenberg",
"NGREENBE",
"515.124.4569",
"17-Aug-94",
"FI_MGR",
12000,
{},
std::make_unique<int>(101),
100});
storage.replace(Employee{109,
"Daniel",
"Faviet",
"DFAVIET",
"515.124.4169",
"16-Aug-94",
"FI_ACCOUNT",
9000,
{},
std::make_unique<int>(108),
100});
storage.replace(Employee{110,
"John",
"Chen",
"JCHEN",
"515.124.4269",
"28-Sep-97",
"FI_ACCOUNT",
8200,
{},
std::make_unique<int>(108),
100});
storage.replace(Employee{111,
"Ismael",
"Sciarra",
"ISCIARRA",
"515.124.4369",
"30-Sep-97",
"FI_ACCOUNT",
7700,
{},
std::make_unique<int>(108),
100});
storage.replace(Employee{112,
"Jose Manuel",
"Urman",
"JMURMAN",
"515.124.4469",
"7-Mar-98",
"FI_ACCOUNT",
7800,
{},
std::make_unique<int>(108),
100});
storage.replace(Employee{113,
"Luis",
"Popp",
"LPOPP",
"515.124.4567",
"7-Dec-99",
"FI_ACCOUNT",
6900,
{},
std::make_unique<int>(108),
100});
storage.replace(Employee{114,
"Den",
"Raphaely",
"DRAPHEAL",
"515.127.4561",
"7-Dec-94",
"PU_MAN",
11000,
{},
std::make_unique<int>(100),
30});
storage.replace(Employee{115,
"Alexander",
"Khoo",
"AKHOO",
"515.127.4562",
"18-May-95",
"PU_CLERK",
3100,
{},
std::make_unique<int>(114),
30});
storage.replace(Employee{116,
"Shelli",
"Baida",
"SBAIDA",
"515.127.4563",
"24-Dec-97",
"PU_CLERK",
2900,
{},
std::make_unique<int>(114),
30});
storage.replace(Employee{117,
"Sigal",
"Tobias",
"STOBIAS",
"515.127.4564",
"24-Jul-97",
"PU_CLERK",
2800,
{},
std::make_unique<int>(114),
30});
storage.replace(Employee{118,
"Guy",
"Himuro",
"GHIMURO",
"515.127.4565",
"15-Nov-98",
"PU_CLERK",
2600,
{},
std::make_unique<int>(114),
30});
storage.replace(Employee{119,
"Karen",
"Colmenares",
"KCOLMENA",
"515.127.4566",
"10-Aug-99",
"PU_CLERK",
2500,
{},
std::make_unique<int>(114),
30});
storage.replace(Employee{120,
"Matthew",
"Weiss",
"MWEISS",
"650.123.1234",
"18-Jul-96",
"ST_MAN",
8000,
{},
std::make_unique<int>(100),
50});
storage.replace(Employee{121,
"Adam",
"Fripp",
"AFRIPP",
"650.123.2234",
"10-Apr-97",
"ST_MAN",
8200,
{},
std::make_unique<int>(100),
50});
storage.replace(Employee{122,
"Payam",
"Kaufling",
"PKAUFLIN",
"650.123.3234",
"1-May-95",
"ST_MAN",
7900,
{},
std::make_unique<int>(100),
50});
storage.replace(Employee{123,
"Shanta",
"Vollman",
"SVOLLMAN",
"650.123.4234",
"10-Oct-97",
"ST_MAN",
6500,
{},
std::make_unique<int>(100),
50});
storage.replace(Employee{124,
"Kevin",
"Mourgos",
"KMOURGOS",
"650.123.5234",
"16-Nov-99",
"ST_MAN",
5800,
{},
std::make_unique<int>(100),
50});
storage.replace(Employee{125,
"Julia",
"Nayer",
"JNAYER",
"650.124.1214",
"16-Jul-97",
"ST_CLERK",
3200,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{126,
"Irene",
"Mikkilineni",
"IMIKKILI",
"650.124.1224",
"28-Sep-98",
"ST_CLERK",
2700,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{127,
"James",
"Landry",
"JLANDRY",
"650.124.1334",
"14-Jan-99",
"ST_CLERK",
2400,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{128,
"Steven",
"Markle",
"SMARKLE",
"650.124.1434",
"8-Mar-00",
"ST_CLERK",
2200,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{129,
"Laura",
"Bissot",
"LBISSOT",
"650.124.5234",
"20-Aug-97",
"ST_CLERK",
3300,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{130,
"Mozhe",
"Atkinson",
"MATKINSO",
"650.124.6234",
"30-Oct-97",
"ST_CLERK",
2800,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{131,
"James",
"Marlow",
"JAMRLOW",
"650.124.7234",
"16-Feb-97",
"ST_CLERK",
2500,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{132,
"TJ",
"Olson",
"TJOLSON",
"650.124.8234",
"10-Apr-99",
"ST_CLERK",
2100,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{133,
"Jason",
"Mallin",
"JMALLIN",
"650.127.1934",
"14-Jun-96",
"ST_CLERK",
3300,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{134,
"Michael",
"Rogers",
"MROGERS",
"650.127.1834",
"26-Aug-98",
"ST_CLERK",
2900,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{135,
"Ki",
"Gee",
"KGEE",
"650.127.1734",
"12-Dec-99",
"ST_CLERK",
2400,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{136,
"Hazel",
"Philtanker",
"HPHILTAN",
"650.127.1634",
"6-Feb-00",
"ST_CLERK",
2200,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{137,
"Renske",
"Ladwig",
"RLADWIG",
"650.121.1234",
"14-Jul-95",
"ST_CLERK",
3600,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{138,
"Stephen",
"Stiles",
"SSTILES",
"650.121.2034",
"26-Oct-97",
"ST_CLERK",
3200,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{139,
"John",
"Seo",
"JSEO",
"650.121.2019",
"12-Feb-98",
"ST_CLERK",
2700,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{140,
"Joshua",
"Patel",
"JPATEL",
"650.121.1834",
"6-Apr-98",
"ST_CLERK",
2500,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{141,
"Trenna",
"Rajs",
"TRAJS",
"650.121.8009",
"17-Oct-95",
"ST_CLERK",
3500,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{142,
"Curtis",
"Davies",
"CDAVIES",
"650.121.2994",
"29-Jan-97",
"ST_CLERK",
3100,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{143,
"Randall",
"Matos",
"RMATOS",
"650.121.2874",
"15-Mar-98",
"ST_CLERK",
2600,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{144,
"Peter",
"Vargas",
"PVARGAS",
"650.121.2004",
"9-Jul-98",
"ST_CLERK",
2500,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{145,
"John",
"Russell",
"JRUSSEL",
"011.44.1344.429268",
"1-Oct-96",
"SA_MAN",
14000,
std::make_unique<double>(0.4),
std::make_unique<int>(100),
80});
storage.replace(Employee{146,
"Karen",
"Partners",
"KPARTNER",
"011.44.1344.467268",
"5-Jan-97",
"SA_MAN",
13500,
std::make_unique<double>(0.3),
std::make_unique<int>(100),
80});
storage.replace(Employee{147,
"Alberto",
"Errazuriz",
"AERRAZUR",
"011.44.1344.429278",
"10-Mar-97",
"SA_MAN",
12000,
std::make_unique<double>(0.3),
std::make_unique<int>(100),
80});
storage.replace(Employee{148,
"Gerald",
"Cambrault",
"GCAMBRAU",
"011.44.1344.619268",
"15-Oct-99",
"SA_MAN",
11000,
std::make_unique<double>(0.3),
std::make_unique<int>(100),
80});
storage.replace(Employee{149,
"Eleni",
"Zlotkey",
"EZLOTKEY",
"011.44.1344.429018",
"29-Jan-00",
"SA_MAN",
10500,
std::make_unique<double>(0.2),
std::make_unique<int>(100),
80});
storage.replace(Employee{150,
"Peter",
"Tucker",
"PTUCKER",
"011.44.1344.129268",
"30-Jan-97",
"SA_REP",
10000,
std::make_unique<double>(0.3),
std::make_unique<int>(145),
80});
storage.replace(Employee{151,
"David",
"Bernstein",
"DBERNSTE",
"011.44.1344.345268",
"24-Mar-97",
"SA_REP",
9500,
std::make_unique<double>(0.25),
std::make_unique<int>(145),
80});
storage.replace(Employee{152,
"Peter",
"Hall",
"PHALL",
"011.44.1344.478968",
"20-Aug-97",
"SA_REP",
9000,
std::make_unique<double>(0.25),
std::make_unique<int>(145),
80});
storage.replace(Employee{153,
"Christopher",
"Olsen",
"COLSEN",
"011.44.1344.498718",
"30-Mar-98",
"SA_REP",
8000,
std::make_unique<double>(0.2),
std::make_unique<int>(145),
80});
storage.replace(Employee{154,
"Nanette",
"Cambrault",
"NCAMBRAU",
"011.44.1344.987668",
"9-Dec-98",
"SA_REP",
7500,
std::make_unique<double>(0.2),
std::make_unique<int>(145),
80});
storage.replace(Employee{155,
"Oliver",
"Tuvault",
"OTUVAULT",
"011.44.1344.486508",
"23-Nov-99",
"SA_REP",
7000,
std::make_unique<double>(0.15),
std::make_unique<int>(145),
80});
storage.replace(Employee{156,
"Janette",
"King",
"JKING",
"011.44.1345.429268",
"30-Jan-96",
"SA_REP",
10000,
std::make_unique<double>(0.35),
std::make_unique<int>(146),
80});
storage.replace(Employee{157,
"Patrick",
"Sully",
"PSULLY",
"011.44.1345.929268",
"4-Mar-96",
"SA_REP",
9500,
std::make_unique<double>(0.35),
std::make_unique<int>(146),
80});
storage.replace(Employee{158,
"Allan",
"McEwen",
"AMCEWEN",
"011.44.1345.829268",
"1-Aug-96",
"SA_REP",
9000,
std::make_unique<double>(0.35),
std::make_unique<int>(146),
80});
storage.replace(Employee{159,
"Lindsey",
"Smith",
"LSMITH",
"011.44.1345.729268",
"10-Mar-97",
"SA_REP",
8000,
std::make_unique<double>(0.3),
std::make_unique<int>(146),
80});
storage.replace(Employee{160,
"Louise",
"Doran",
"LDORAN",
"011.44.1345.629268",
"15-Dec-97",
"SA_REP",
7500,
std::make_unique<double>(0.3),
std::make_unique<int>(146),
80});
storage.replace(Employee{161,
"Sarath",
"Sewall",
"SSEWALL",
"011.44.1345.529268",
"3-Nov-98",
"SA_REP",
7000,
std::make_unique<double>(0.25),
std::make_unique<int>(146),
80});
storage.replace(Employee{162,
"Clara",
"Vishney",
"CVISHNEY",
"011.44.1346.129268",
"11-Nov-97",
"SA_REP",
10500,
std::make_unique<double>(0.25),
std::make_unique<int>(147),
80});
storage.replace(Employee{163,
"Danielle",
"Greene",
"DGREENE",
"011.44.1346.229268",
"19-Mar-99",
"SA_REP",
9500,
std::make_unique<double>(0.15),
std::make_unique<int>(147),
80});
storage.replace(Employee{164,
"Mattea",
"Marvins",
"MMARVINS",
"011.44.1346.329268",
"24-Jan-00",
"SA_REP",
7200,
std::make_unique<double>(0.1),
std::make_unique<int>(147),
80});
storage.replace(Employee{165,
"David",
"Lee",
"DLEE",
"011.44.1346.529268",
"23-Feb-00",
"SA_REP",
6800,
std::make_unique<double>(0.1),
std::make_unique<int>(147),
80});
storage.replace(Employee{166,
"Sundar",
"Ande",
"SANDE",
"011.44.1346.629268",
"24-Mar-00",
"SA_REP",
6400,
std::make_unique<double>(0.1),
std::make_unique<int>(147),
80});
storage.replace(Employee{167,
"Amit",
"Banda",
"ABANDA",
"011.44.1346.729268",
"21-Apr-00",
"SA_REP",
6200,
std::make_unique<double>(0.1),
std::make_unique<int>(147),
80});
storage.replace(Employee{168,
"Lisa",
"Ozer",
"LOZER",
"011.44.1343.929268",
"11-Mar-97",
"SA_REP",
11500,
std::make_unique<double>(0.25),
std::make_unique<int>(148),
80});
storage.replace(Employee{169,
"Harrison",
"Bloom",
"HBLOOM",
"011.44.1343.829268",
"23-Mar-98",
"SA_REP",
10000,
std::make_unique<double>(0.2),
std::make_unique<int>(148),
80});
storage.replace(Employee{170,
"Tayler",
"Fox",
"TFOX",
"011.44.1343.729268",
"24-Jan-98",
"SA_REP",
9600,
std::make_unique<double>(0.2),
std::make_unique<int>(148),
80});
storage.replace(Employee{171,
"William",
"Smith",
"WSMITH",
"011.44.1343.629268",
"23-Feb-99",
"SA_REP",
7400,
std::make_unique<double>(0.15),
std::make_unique<int>(148),
80});
storage.replace(Employee{172,
"Elizabeth",
"Bates",
"EBATES",
"011.44.1343.529268",
"24-Mar-99",
"SA_REP",
7300,
std::make_unique<double>(0.15),
std::make_unique<int>(148),
80});
storage.replace(Employee{173,
"Sundita",
"Kumar",
"SKUMAR",
"011.44.1343.329268",
"21-Apr-00",
"SA_REP",
6100,
std::make_unique<double>(0.1),
std::make_unique<int>(148),
80});
storage.replace(Employee{174,
"Ellen",
"Abel",
"EABEL",
"011.44.1644.429267",
"11-May-96",
"SA_REP",
11000,
std::make_unique<double>(0.3),
std::make_unique<int>(149),
80});
storage.replace(Employee{175,
"Alyssa",
"Hutton",
"AHUTTON",
"011.44.1644.429266",
"19-Mar-97",
"SA_REP",
8800,
std::make_unique<double>(0.25),
std::make_unique<int>(149),
80});
storage.replace(Employee{176,
"Jonathon",
"Taylor",
"JTAYLOR",
"011.44.1644.429265",
"24-Mar-98",
"SA_REP",
8600,
std::make_unique<double>(0.2),
std::make_unique<int>(149),
80});
storage.replace(Employee{177,
"Jack",
"Livingston",
"JLIVINGS",
"011.44.1644.429264",
"23-Apr-98",
"SA_REP",
8400,
std::make_unique<double>(0.2),
std::make_unique<int>(149),
80});
storage.replace(Employee{178,
"Kimberely",
"Grant",
"KGRANT",
"011.44.1644.429263",
"24-May-99",
"SA_REP",
7000,
std::make_unique<double>(0.15),
std::make_unique<int>(149),
80});
storage.replace(Employee{179,
"Charles",
"Johnson",
"CJOHNSON",
"011.44.1644.429262",
"4-Jan-00",
"SA_REP",
6200,
std::make_unique<double>(0.1),
std::make_unique<int>(149),
80});
storage.replace(Employee{180,
"Winston",
"Taylor",
"WTAYLOR",
"650.507.9876",
"24-Jan-98",
"SH_CLERK",
3200,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{181,
"Jean",
"Fleaur",
"JFLEAUR",
"650.507.9877",
"23-Feb-98",
"SH_CLERK",
3100,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{182,
"Martha",
"Sullivan",
"MSULLIVA",
"650.507.9878",
"21-Jun-99",
"SH_CLERK",
2500,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{183,
"Girard",
"Geoni",
"GGEONI",
"650.507.9879",
"3-Feb-00",
"SH_CLERK",
2800,
{},
std::make_unique<int>(120),
50});
storage.replace(Employee{184,
"Nandita",
"Sarchand",
"NSARCHAN",
"650.509.1876",
"27-Jan-96",
"SH_CLERK",
4200,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{185,
"Alexis",
"Bull",
"ABULL",
"650.509.2876",
"20-Feb-97",
"SH_CLERK",
4100,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{186,
"Julia",
"Dellinger",
"JDELLING",
"650.509.3876",
"24-Jun-98",
"SH_CLERK",
3400,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{187,
"Anthony",
"Cabrio",
"ACABRIO",
"650.509.4876",
"7-Feb-99",
"SH_CLERK",
3000,
{},
std::make_unique<int>(121),
50});
storage.replace(Employee{188,
"Kelly",
"Chung",
"KCHUNG",
"650.505.1876",
"14-Jun-97",
"SH_CLERK",
3800,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{189,
"Jennifer",
"Dilly",
"JDILLY",
"650.505.2876",
"13-Aug-97",
"SH_CLERK",
3600,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{190,
"Timothy",
"Gates",
"TGATES",
"650.505.3876",
"11-Jul-98",
"SH_CLERK",
2900,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{191,
"Randall",
"Perkins",
"RPERKINS",
"650.505.4876",
"19-Dec-99",
"SH_CLERK",
2500,
{},
std::make_unique<int>(122),
50});
storage.replace(Employee{192,
"Sarah",
"Bell",
"SBELL",
"650.501.1876",
"4-Feb-96",
"SH_CLERK",
4000,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{193,
"Britney",
"Everett",
"BEVERETT",
"650.501.2876",
"3-Mar-97",
"SH_CLERK",
3900,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{194,
"Samuel",
"McCain",
"SMCCAIN",
"650.501.3876",
"1-Jul-98",
"SH_CLERK",
3200,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{195,
"Vance",
"Jones",
"VJONES",
"650.501.4876",
"17-Mar-99",
"SH_CLERK",
2800,
{},
std::make_unique<int>(123),
50});
storage.replace(Employee{196,
"Alana",
"Walsh",
"AWALSH",
"650.507.9811",
"24-Apr-98",
"SH_CLERK",
3100,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{197,
"Kevin",
"Feeney",
"KFEENEY",
"650.507.9822",
"23-May-98",
"SH_CLERK",
3000,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{198,
"Donald",
"OConnell",
"DOCONNEL",
"650.507.9833",
"21-Jun-99",
"SH_CLERK",
2600,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{199,
"Douglas",
"Grant",
"DGRANT",
"650.507.9844",
"13-Jan-00",
"SH_CLERK",
2600,
{},
std::make_unique<int>(124),
50});
storage.replace(Employee{200,
"Jennifer",
"Whalen",
"JWHALEN",
"515.123.4444",
"17-Sep-87",
"AD_ASST",
4400,
{},
std::make_unique<int>(101),
10});
storage.replace(Employee{201,
"Michael",
"Hartstein",
"MHARTSTE",
"515.123.5555",
"17-Feb-96",
"MK_MAN",
13000,
{},
std::make_unique<int>(100),
20});
storage.replace(Employee{202,
"Pat",
"Fay",
"PFAY",
"603.123.6666",
"17-Aug-97",
"MK_REP",
6000,
{},
std::make_unique<int>(201),
20});
storage.replace(Employee{203,
"Susan",
"Mavris",
"SMAVRIS",
"515.123.7777",
"7-Jun-94",
"HR_REP",
6500,
{},
std::make_unique<int>(101),
40});
storage.replace(Employee{204,
"Hermann",
"Baer",
"HBAER",
"515.123.8888",
"7-Jun-94",
"PR_REP",
10000,
{},
std::make_unique<int>(101),
70});
storage.replace(Employee{205,
"Shelley",
"Higgins",
"SHIGGINS",
"515.123.8080",
"7-Jun-94",
"AC_MGR",
12000,
{},
std::make_unique<int>(101),
110});
storage.replace(Employee{206,
"William",
"Gietz",
"WGIETZ",
"515.123.8181",
"7-Jun-94",
"AC_ACCOUNT",
8300,
{},
std::make_unique<int>(205),
110});
storage.replace(Department{10, "Administration", 200, 1700});
storage.replace(Department{20, "Marketing", 201, 1800});
storage.replace(Department{30, "Purchasing", 114, 1700});
storage.replace(Department{40, "Human Resources", 203, 2400});
storage.replace(Department{50, "Shipping", 121, 1500});
storage.replace(Department{60, "IT", 103, 1400});
storage.replace(Department{70, "Public Relations", 204, 2700});
storage.replace(Department{80, "Sales", 145, 2500});
storage.replace(Department{90, "Executive", 100, 1700});
storage.replace(Department{100, "Finance", 108, 1700});
storage.replace(Department{110, "Accounting", 205, 1700});
storage.replace(Department{120, "Treasury", 0, 1700});
storage.replace(Department{130, "Corporate Tax", 0, 1700});
storage.replace(Department{140, "Control And Credit", 0, 1700});
storage.replace(Department{150, "Shareholder Services", 0, 1700});
storage.replace(Department{160, "Benefits", 0, 1700});
storage.replace(Department{170, "Manufacturing", 0, 1700});
storage.replace(Department{180, "Construction", 0, 1700});
storage.replace(Department{190, "Contracting", 0, 1700});
storage.replace(Department{200, "Operations", 0, 1700});
storage.replace(Department{210, "IT Support", 0, 1700});
storage.replace(Department{220, "NOC", 0, 1700});
storage.replace(Department{230, "IT Helpdesk", 0, 1700});
storage.replace(Department{240, "Government Sales", 0, 1700});
storage.replace(Department{250, "Retail Sales", 0, 1700});
storage.replace(Department{260, "Recruiting", 0, 1700});
storage.replace(Department{270, "Payroll", 0, 1700});
storage.replace(JobHistory{102, "1993-01-13", "1998-07-24", "IT_PROG", 60});
storage.replace(JobHistory{101, "1989-09-21", "1993-10-27", "AC_ACCOUNT", 110});
storage.replace(JobHistory{101, "1993-10-28", "1997-03-15", "AC_MGR", 110});
storage.replace(JobHistory{201, "1996-02-17", "1999-12-19", "MK_REP", 20});
storage.replace(JobHistory{114, "1998-03-24", "1999-12-31", "ST_CLERK", 50});
storage.replace(JobHistory{122, "1999-01-01", "1999-12-31", "ST_CLERK", 50});
storage.replace(JobHistory{200, "1987-09-17", "1993-06-17", "AD_ASST", 90});
storage.replace(JobHistory{176, "1998-03-24", "1998-12-31", "SA_REP", 80});
storage.replace(JobHistory{176, "1999-01-01", "1999-12-31", "SA_MAN", 80});
storage.replace(JobHistory{200, "1994-07-01", "1998-12-31", "AC_ACCOUNT", 90});
{
// SELECT first_name, last_name, salary
// FROM employees
// WHERE salary >(
// SELECT salary
// FROM employees
// WHERE first_name='Alexander');
auto rows = storage.select(
columns(&Employee::firstName, &Employee::lastName, &Employee::salary),
where(greater_than(&Employee::salary,
select(&Employee::salary, where(is_equal(&Employee::firstName, "Alexander"))))));
cout << "first_name last_name salary" << endl;
cout << "---------- ---------- ----------" << endl;
for(auto& row: rows) {
cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << endl;
}
}
{
// SELECT employee_id,first_name,last_name,salary
// FROM employees
// WHERE salary > (SELECT AVG(SALARY) FROM employees);
auto rows = storage.select(columns(&Employee::id, &Employee::firstName, &Employee::lastName, &Employee::salary),
where(greater_than(&Employee::salary, select(avg(&Employee::salary)))));
cout << "employee_id first_name last_name salary" << endl;
cout << "----------- ---------- ---------- ----------" << endl;
for(auto& row: rows) {
cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << '\t' << std::get<3>(row)
<< endl;
}
}
{
// SELECT first_name, last_name, department_id
// FROM employees
// WHERE department_id IN
// (SELECT DEPARTMENT_ID FROM departments
// WHERE location_id=1700);
auto rows = storage.select(
columns(&Employee::firstName, &Employee::lastName, &Employee::departmentId),
from<Employee>(),
where(in(&Employee::departmentId, select(&Department::id, where(c(&Department::locationId) == 1700)))));
cout << "first_name last_name department_id" << endl;
cout << "---------- ---------- -------------" << endl;
for(auto& row: rows) {
cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << endl;
}
}
{
// SELECT first_name, last_name, department_id
// FROM employees
// WHERE department_id NOT IN
// (SELECT DEPARTMENT_ID FROM departments
// WHERE manager_id
// BETWEEN 100 AND 200);
auto rows =
storage.select(columns(&Employee::firstName, &Employee::lastName, &Employee::departmentId),
from<Employee>(),
where(not_in(&Employee::departmentId,
select(&Department::id, where(between(&Department::managerId, 100, 200))))));
cout << "first_name last_name department_id" << endl;
cout << "---------- ---------- -------------" << endl;
for(auto& row: rows) {
cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << endl;
}
}
{
// SELECT last_name, salary, department_id
// FROM employees e
// WHERE salary >(SELECT AVG(salary)
// FROM employees
// WHERE department_id = e.department_id);
using als = alias_e<Employee>;
auto rows = storage.select(
columns(alias_column<als>(&Employee::lastName),
alias_column<als>(&Employee::salary),
alias_column<als>(&Employee::departmentId)),
from<als>(),
where(greater_than(
alias_column<als>(&Employee::salary),
select(avg(&Employee::salary),
from<Employee>(),
where(is_equal(&Employee::departmentId, alias_column<als>(&Employee::departmentId)))))));
cout << "last_name salary department_id" << endl;
cout << "---------- ---------- -------------" << endl;
for(auto& row: rows) {
cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << endl;
}
}
{
// SELECT first_name, last_name, employee_id, job_id
// FROM employees
// WHERE 1 <=
// (SELECT COUNT(*) FROM Job_history
// WHERE employee_id = employees.employee_id);
auto rows =
storage.select(columns(&Employee::firstName, &Employee::lastName, &Employee::id, &Employee::jobId),
from<Employee>(),
where(lesser_or_equal(1,
select(count<JobHistory>(),
from<JobHistory>(),
where(is_equal(&Employee::id, &JobHistory::employeeId))))));
cout << "first_name last_name employee_id job_id" << endl;
cout << "---------- ---------- ----------- ----------" << endl;
for(auto& row: rows) {
cout << std::get<0>(row) << '\t' << std::get<1>(row) << '\t' << std::get<2>(row) << '\t' << std::get<3>(row)
<< endl;
}
}
return 0;
}