Table1 (id, name) Table2 (id, name)
查询:
SELECT name
FROM table2
-- that are not in table1 already
Table1 (id, name) Table2 (id, name)
查询:
SELECT name
FROM table2
-- that are not in table1 already
当前回答
这是纯集合论你可以用减号运算来实现。
select id, name from table1
minus
select id, name from table2
其他回答
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
问:这里发生了什么?
答:从概念上讲,我们从table1中选择所有行,对于每一行,我们尝试在table2中为name列找到具有相同值的行。如果没有这样的行,我们就把结果的table2部分留给该行。然后,通过只选择结果中匹配行不存在的行来限制选择。最后,我们忽略结果中的所有字段,除了name列(table1中我们确定存在的字段)。
虽然它可能不是在所有情况下性能最好的方法,但它应该适用于几乎所有试图实现ANSI 92 SQL的数据库引擎
你可以选择
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
or
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
请看这个问题的3个技巧来完成这个任务
我将在正确答案....中转发(因为我还没有酷到可以评论)以防有人觉得需要更好的解释。
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
在mySQL中,我看到FROM中的语法需要在表名之间使用逗号,但在sqlLite中,它似乎更喜欢空格。
底线是,当你使用不好的变量名时,它会留下问题。我的变量应该更有意义。应该有人解释一下为什么我们需要逗号或不需要逗号。
这是纯集合论你可以用减号运算来实现。
select id, name from table1
minus
select id, name from table2
看到查询:
SELECT * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
从概念上讲是:在子查询中获取匹配的记录,然后在主查询中获取不在子查询中的记录。