Sql 仅联接其他表中每行的顶部(最新)值
我是SQL新手,所以现有的答案对我来说有点复杂。 我有三张桌子:Sql 仅联接其他表中每行的顶部(最新)值,sql,sqlite,Sql,Sqlite,我是SQL新手,所以现有的答案对我来说有点复杂。 我有三张桌子: WORKER |id |name |date |... JOB |id |name |salary |accept APPOINTMENT |id |worker_id |job_id |date 所以,若工人在一年内被任命几次,我需要知道他在某个特定的时间从事什么工作 我现在有这样的东西: SELECT w.name,w.id FROM worker w INNER JOIN appointment a ON w.id
WORKER
|id
|name
|date
|...
JOB
|id
|name
|salary
|accept
APPOINTMENT
|id
|worker_id
|job_id
|date
所以,若工人在一年内被任命几次,我需要知道他在某个特定的时间从事什么工作
我现在有这样的东西:
SELECT w.name,w.id FROM worker w
INNER JOIN appointment a ON w.id = worker_id
INNER JOIN job j on job_id = j.id
WHERE accept = 1 AND a.date <= (SELECT date FROM orders WHERE id = 2);
订单只用于获取日期。它可以从任何来源更改为任何。因此,在这种情况下,这并不重要。
Job中的Accept只是一个布尔值,它表示指定的工人可以接受新订单。
因此,它的完整含义是在组合框中以编辑形式显示所有能够接受订单的工人,而不仅仅是在创建订单时现在能够接受订单的工人
日期表示为自1970年起天数的整数值。
假装在输出中的行:
w.name w.id a.id a.date j.name j.accept
Smith 2 7 42999 administrator 1
Joe 1 6 42994 administrator 1
Smith 2 5 42994 waiter 0
Joe 1 4 42993 waiter 0
Smith 2 3 42992 administrator 1
Smith 2 2 42991 waiter 0
Smith 2 1 42990 administrator 1
我通过我的查询收到的信息列在此编辑a.date上方。要获取每个员工的最后一次约会,请使用分组。在第二步中过滤掉未被接受的内容:
SELECT ...
FROM (SELECT worker_id,
job_id,
MAX(date) AS date
FROM appointment
WHERE date <= ...
GROUP BY worker_id) AS a
JOIN worker AS w ON a.worker_id = w.id
JOIN job AS j ON a.job_id = j.id
WHERE accept = 1;
什么是订单?你能写几行字吗。。。还有几行插页。。。要创建一个?从sqlite命令行工具中转储一个适当定制的toy数据库将是完美的。此外,请提供与玩具数据库内容匹配的所需输出。理想情况下,为不同的工人、不同的时间提供几个示例。
Joe 1 6 42994 administrator 1
Smith 2 3 42992 administrator 1 //isn't current Smith's job
Smith 2 1 42990 administrator 1 //isn't current Smith's job
//Last job in 42998
Joe 1 6 42994 administrator 1
Smith 2 5 42994 waiter 0
//Last job in 42999
Smith 2 7 42999 administrator 1
Joe 1 6 42994 administrator 1
//Workers which were able to accept order in 42998
Joe 1 6 42994 administrator 1
//Workers which were able to accept order in 42999
Smith 2 7 42999 administrator 1
Joe 1 6 42994 administrator 1
CREATE TABLE appointment (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, worker_id INTEGER NOT NULL, job_id INTEGER, date INTEGER NOT NULL);
CREATE TABLE worker (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name TEXT NOT NULL);
CREATE TABLE job (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name TEXT NOT NULL,accept INTEGER NOT NULL);
INSERT INTO worker (name) VALUES ('Joe');
INSERT INTO worker (name) VALUES ('Smith');
INSERT INTO job (name,accept) VALUES ('waiter',0);
INSERT INTO job (name,accept) VALUES ('administrator',1);
INSERT INTO appointment (worker_id,job_id,date) VALUES (2,2,42990);
INSERT INTO appointment (worker_id,job_id,date) VALUES (2,1,42991);
INSERT INTO appointment (worker_id,job_id,date) VALUES (2,2,42992);
INSERT INTO appointment (worker_id,job_id,date) VALUES (1,1,42993);
INSERT INTO appointment (worker_id,job_id,date) VALUES (2,1,42994);
INSERT INTO appointment (worker_id,job_id,date) VALUES (1,2,42994);
INSERT INTO appointment (worker_id,job_id,date) VALUES (2,2,42999);
SELECT ...
FROM (SELECT worker_id,
job_id,
MAX(date) AS date
FROM appointment
WHERE date <= ...
GROUP BY worker_id) AS a
JOIN worker AS w ON a.worker_id = w.id
JOIN job AS j ON a.job_id = j.id
WHERE accept = 1;