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查询从某些表中不存在的子选择返回值?的主要内容,如果未能解决你的问题,请参考以下文章