Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于SqlServer,其中*不存在_Sql_Sql Server - Fatal编程技术网

对于SqlServer,其中*不存在

对于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

我得到了两个表,订单有两列作为orderid和customerid,客户有两列作为customerid和location

我要做的是查找表Customers中的所有customerid,它们不在订单中。例如,Customers.customerid={A,B,C,D},Orders.customerid={A,B,C},我想我需要做的只是从客户那里得到那些,但不存在于订单中。为了实现这一目标,我提出

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语句: