SQL查询从某些表中不存在的子选择返回值?

时间:2016-05-19 15:07:38

标签: sql sql-server exists

我正在寻找一种编写执行以下操作的查询的方法:

SELECT NAME 
FROM   customer_table 
WHERE  NOT EXISTS (SELECT NAME 
                   FROM   order_table 
                   WHERE  NAME IN ( 'Mary Smith', 'Albert Angelo', 'Bob Rogers')
                  ) 

我希望结果是CUSTOMER_TABLE中不存在的名称列表,这些名称是从ORDER_TABLE上的子选择中选择的(因此订单表中存在的该范围内的值但是#39; t存在于customer_table中)。但是这个查询除了在子查询的范围中列出之外,还获得了CUSTOMER_TABLE中所有其他不匹配的NAME值。

我希望这能够用于大量名称,这些名称太大而无法手工输入。

3 个答案:

答案 0 :(得分:0)

您的查询缺少与子查询的关联。

select NAME 
from order_table o
where NOT EXISTS (select 1 
                  from customer_table c
                  where o.name = c.name
                  )

或者您可以使用left join来执行此操作。

select o.name
from order_table o
left join customer_table c on o.name = c.name
where c.name is null

答案 1 :(得分:0)

从第一个选择中选择但在CUSTOMER_TABLE中不存在的名称列表

SELECT NAME 
FROM   order_table 
WHERE  NAME IN ( 'Mary Smith', 'Albert Angelo', 'Bob Rogers')
EXCEPT
SELECT DISTINCT NAME
FROM CUSTOMER_TABLE

答案 2 :(得分:0)

当您需要customer_table中不存在的名称时,请首先检索您要查找的名称,然后在子查询中编写customer_table,以使用NOT EXISTS过滤这些名称。但是你在外部查询中使用customer_table进行对等。

或者您可以使用CTE选择要比较的所有名称,然后使用customer table过滤它们,如下所示。

WITH CTE
AS
(
SELECT NAME 
             FROM   order_table 
             WHERE  NAME IN ( 'Mary Smith', 'Albert Angelo', 'Bob Rogers')
)

SELECT NAME FROM CTE WHERE NAME NOT IN (SELECT NAME FROM CUSTOMER_TABLE)

希望这个查询可以帮助你@jennifer