Table1 (id, name) Table2 (id, name)

查询:

SELECT name   
FROM table2  
-- that are not in table1 already

当前回答

你可以在mssql中使用EXCEPT或在oracle中使用MINUS,它们是相同的:

http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-oracle/

其他回答

你可以在mssql中使用EXCEPT或在oracle中使用MINUS,它们是相同的:

http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-oracle/

我没有足够的代表点数来给froadie的答案投票。但我不同意对克里斯回答的评论。以下答案:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

在实践中效率更高。我不知道为什么,但我对800k+的记录进行了运行,上面发布的第二个答案的优势是巨大的。只有我的0.02美元。

我尝试了以上所有的解决方案,但它们都不适合我。下面的查询对我有用。

SELECT NAME
FROM   table_1
WHERE  NAME NOT IN
       (SELECT    a.NAME
        FROM      table_1 AS a
        LEFT JOIN table_2 AS b
        ON        a.NAME = b.NAME
        WHERE     any further condition);

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 t1.name FROM table1 t1 JOIN table2 t2 ON t2。Fk_id != t1.id;

表1:

id name
1 Amit
2 Sagar

表二:

id fk_id email
1 1 amit@ma.com

输出:

name
Sagar