我有一个脑死亡的时刻......我有两个表格描述:
CREATE TABLE table_a (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL
UNIQUE (name))
CREATE TABLE table_b (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
a_key INTEGER NOT NULL,
other_stuff VARCHAR(255) NOT NULL,
FOREIGN KEY(a_key) REFERENCES table_a(id)
ON DELETE CASCADE)
如何从table_a中选择table_b.a_key中没有条目的所有行?
答案 0 :(得分:11)
SELECT table_a.*
FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.a_key
WHERE table_b.id IS NULL
答案 1 :(得分:4)
天真地,您可以使用NOT EXISTS子查询:
SELECT A.*
FROM table_a A
WHERE NOT EXISTS (
SELECT 1
FROM table_b B
WHERE B.a_key = A.id
)
您也可以尝试外部联接。但他们通常会在内部优化到同一个查询。
答案 2 :(得分:4)
SELECT
table_a.*
FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.a_key
WHERE b.id IS NULL;
这对table_a和table_b进行了JOIN,并且JOIN没有找到table_b的连接结果,它会打印table_a的相应行条目。
答案 3 :(得分:1)
如果是SQL Server 2005+,您可以尝试使用EXCEPT
SELECT id
FROM table_a
EXCEPT
SELECT a_key
FROM table_b;
答案 4 :(得分:0)
select a.*
from table_a a
where a.id not in (select b.a_key from table_b b where b.a_key = a.id)