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

Posted

技术标签:

【中文标题】SQL查询从某些表中不存在的子选择返回值?【英文标题】:SQL query to return value from sub-select that does not exist in some table? 【发布时间】:2016-05-19 15:07:38 【问题描述】:

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

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

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

我希望它能够用于大量无法手动输入的名称。

【问题讨论】:

您的问题说您想要一个在customer_table 中不存在的名称列表,但您的外部查询是从customer_table 中选择的,这使得问题难以理解。你真的想要order_table 中但不在customer_table 中的名称列表吗? 是的,你是对的。我想从 order_table 中但不在 customer_table 中的指定范围中获取名称。抱歉措辞不佳! 那么 vkp 的答案中的第二个查询是正确的,使用左连接的那个,但我不会赞成它,因为第一个不正确。 【参考方案1】:

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

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

【讨论】:

我不完全确定这是他想要的,他的查询结构暗示了其他明智的,但也许他错了。 这两个查询会有不同的结果。话虽如此,我认为第二个是 Jennifer 正在寻找的。​​span> 【参考方案2】:

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

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

【讨论】:

【参考方案3】:

当您想要 customer_table 中不存在的名称时,首先检索您要查找的名称,然后在子查询中编写 customer_table 以使用 NOT EXISTS 过滤这些名称。但是您在外部查询中使用 customer_table 正在做相反的事情。

或者,您可以使用 CTE 选择所有要比较的名称,然后使用此处所示的客户表过滤它们。

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

【讨论】:

以上是关于SQL查询从某些表中不存在的子选择返回值?的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL SELECT 语句中获取值,即使它在表中不存在

从sql中返回的查询值的子查询?

SQL从另一个表中选择平均评分

SQL 查询 (Pro*C) 如何能够找到 db 表中不存在的一组值

在C#中使用SQL语句查询数据在表中是不是存在输出是或否

SQL Server:根据来自其他 2 个表的子查询从表中选择