用于选择未引用行的SQL查询

时间:2009-02-05 12:26:27

标签: sql mysql

我有一个脑死亡的时刻......我有两个表格描述:

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中没有条目的所有行?

5 个答案:

答案 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)