对于SqlServer,其中*不存在
我得到了两个表,订单有两列作为orderid和customerid,客户有两列作为customerid和location 我要做的是查找表Customers中的所有customerid,它们不在订单中。例如,Customers.customerid={A,B,C,D},Orders.customerid={A,B,C},我想我需要做的只是从客户那里得到那些,但不存在于订单中。为了实现这一目标,我提出对于SqlServer,其中*不存在,sql,sql-server,Sql,Sql Server,我得到了两个表,订单有两列作为orderid和customerid,客户有两列作为customerid和location 我要做的是查找表Customers中的所有customerid,它们不在订单中。例如,Customers.customerid={A,B,C,D},Orders.customerid={A,B,C},我想我需要做的只是从客户那里得到那些,但不存在于订单中。为了实现这一目标,我提出 select customerid from Customers where customeri
select customerid from Customers where customerid not exists (select customerid from Orders)
但是它什么也不返回。。我的逻辑非常简单,首先从表订单中获取所有customerid,然后从表订单中获取customerid中不存在的那些。我不明白为什么这是错的
我后来试过了,效果很好。有人能帮我吗
select customerid from Customers as c where customerid not exists(select customerid from orders as o where c.customerid = o.customerid)
为什么我必须添加c.customerid=o.customerid 您可能需要:
select customerid from Customers where customerid not in (select customerid from Orders)
为什么我必须添加c.customerid=o.customerid
因为仅仅因为您对数据库中的两列使用相同的名称,并不意味着它们之间存在任何特定的关系
您需要添加c.customerid=o.customerid来指定您对这两列相等的特定条件感兴趣
但语言也允许任何其他相关条件。例如,您可以编写一个查询:
select customerid from Customers as c where not exists(
select customerid from Customers as c2 where c2.customerid < c.customerid)
如果考虑到按customerid值排序的客户,并不是说这是编写此查询的最佳方式,而是一种灵活性的演示,那么这将发现您是第一个客户
您的第一个查询实际上是给我Customer表中的所有行,前提是Order表中不存在任何行-这也是一个非常有效的要求,但不是您想要的-您想要执行某种形式的关联,这就是你在第二个问题中所做的。@Damien\u不信者给出了正确的解释,你需要像这样尝试
Try below query :
SELECT customerid from Customers C WHERE NOT EXISTS
(
SELECT 1 FROM orders O WHERE C.customerid = O.customerid
)
我为两个表创建了一些数据
CREATE TABLE #Orders
(orderid varchar(10), customerid varchar(10))
insert into #Orders values
('venkat','a'),
('raj','b'),
('mahes','c')
CREATE TABLE #Customers
(customerid varchar(10), [location] varchar(10))
insert into #Customers values
('a','and'),
('b','bar'),
('c','board'),
('D','board1')
SELECT cu.customerid from #Customers CU WHERE NOT EXISTS
(
SELECT 1 FROM #orders b WHERE Cu.customerid = b.customerid
)
输出
customerid
D
你需要的是
select c.customerid from customer c inner join order o on c.customerid = o.customerid where c.customerid not in (select od.customerid from order od)
如果不连接两个表,则无法访问它们的数据。语法有点不正确。你的意思是这样写的:
SELECT C.CustomerID
FROM Customers C
WHERE NOT EXISTS
(
SELECT O.CustomerID
FROM Orders O
WHERE O.CustomerID = C.CustomerID
)
;
您也可以使用NOT IN来执行此操作,例如:
SELECT customerid
FROM Customers
WHERE customerid NOT IN
(
SELECT customerid
FROM Orders
)
;
在大多数情况下,这两者在语义上是等价的
有些人可能会告诉你,你可以用左连接/IS NULL构造做同样的事情,但你可以看看为什么在很多情况下这是一个更糟糕的选择。我想知道为什么第二个查询有效,而第一个查询无效,我想在幕后有一些我不知道的事情,我真的很想知道为什么SQL Server允许您在没有任何警告或错误的情况下运行这些查询,但您的问题很简单,在询问之前,您应该阅读并理解EXISTS语句: