2017-02-24 70 views
0

我得到了兩個表,訂單有兩列作爲orderid和customerid,以及有兩列作爲customerid和location的客戶。與SqlServer,其中*不存在

我想要做的是在表Customers中找到所有customerid,它們不在Orders中。例如,Customers.customerid = {A,B,C,D},Orders.customerid = {A,B,C},我想要做的只是從客戶那裏獲取,而不是在訂單中存在。爲了實現這一點,我說,

select customerid from Customers where customerid not exists (select customerid from Orders) 

但它沒有返回。我的邏輯是相當簡單的像,第一次拿到表中所有訂單客戶ID,然後得到它不會在customerIds從表Orders exisit的那些。我看不出爲什麼這是錯誤的。

我以後試過,它工作。任何人都可以幫助我嗎?

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?

+0

不知道爲什麼SQL Server允許您在沒有任何警告或錯誤的情況下運行這些查詢,但是您的問題非常簡單,您應該在詢問之前閱讀並理解「EXISTS」語句:https://technet.microsoft.com/zh-cn/ -us/library/ms189259(v = sql.105).aspx –

回答

1

爲什麼我要加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值(不,這是寫這個查詢的最佳方式排序的客戶,它只是一個示範靈活性)


你的第一個查詢,實際上「給我從客戶表中的所有行,前提是在訂單表中不存在行」 - 這還用問了一個非常有效的事情,但不是你想要的 - 你打算執行某種形式的關聯,這是你在第二個查詢中所做的。

+0

感謝您的回答,現在很清楚! –

0

可能是你需要:

select customerid from Customers where customerid not in (select customerid from Orders) 
+0

之前嘗試過,但它仍然沒有返回任何內容。 –

+0

我想知道爲什麼第二個查詢有效,但第一個查詢不起作用,不知道在幕後,我真的很想知道 –

0
Try below query : 

SELECT customerid from Customers C WHERE NOT EXISTS 
(
    SELECT 1 FROM orders O WHERE C.customerid = O.customerid 
) 
0

@Damien_The_Unbeliever給予正確的解釋和u需要嘗試這樣

有一些數據我2個表

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 
0

創建你需要的是

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) 

如果不加入它們,則無法訪問2個表的數據。

0

語法有點偏離。你的意思是把它寫這樣的:

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 
) 
; 

兩個在語義上是等價的,大部分。

有些人可能會告訴你,你可以用LEFT JOIN/IS NULL構造做同樣的事情,但你可以看看this article,看看爲什麼在許多情況下這是一個較差的選擇。