2011-10-05 41 views
0

我加入的表一樣,這裏的結果: http://www.w3schools.com/sql/sql_join_left.asp連接的表 - 和WHERE

LastName FirstName OrderNo 
Hansen  Ola   1 
Hansen  Ola   2 
Hansen  Ola   3 
Pettersen Kari  8 
Pettersen Kari  9 
Svendson Tove  

我怎樣才能找到具有與之相關的兩個訂單1和2人(姓,名)名單。

+2

不要使用w3schools,這不是一個好資源,請參閱:http://w3fools.com – Johan

回答

2

刪除第二個WHERE

WHERE OrderNo = 1 OR OrderNo = 2 

OR

WHERE OrderNo IN (1,2) 
+2

AND'是錯誤的。它應該是一個'OR'。 – Spudley

+0

是好斑點。我已經更新了我的答案。 – DaveHogan

+0

好的。我已經刪除了我的-1。 :)(讓我感到驚訝的是,三個單獨的答案都犯了同樣的錯誤!他們現在都被糾正了,但肯定有某種集體失明發生) – Spudley

1

首先,不寫WHERE兩次。根據SELECT,您只能獲得一個WHERE條款。

其次,你不能有一行OrderNo = 1 AND OrderNo = 2。這兩個都不可能同時成立。使用OR代替AND

WHERE OrderNo = 1 
OR OrderNo = 2 

在這種情況下,你可以只使用IN

WHERE OrderNo IN (1, 2) 
0

完全佔據例子(與可讀性明確table.Field):

Select persons.LastName, persons.FirstName, orders.OrderNo 
FROM Persons 
LEFT JOIN Orders order1 ON persons.P_Id=orders1.P_Id 
LEFT JOIN Orders order2 ON persons.P_Id=orders2.P_Id 
where (orders.OrderNo = 1 or orders.OrderNo = 2 

在使用連接時非常明確地表示重要,以便您(以及後面的開發人員)不會感到困惑。不提供table.Field也會拋出錯誤,如果兩個表具有相同名稱的字段。

更新

從另一個迴應評論:

或作品,但無論怎樣我都會喜歡。我需要得到OrderNo = 1和OrderNo = 2的記錄.1和2都一起計算。如果我使用或它會返回我有這些值或兩個之一的記錄

如果我正確閱讀這個,你只是在尋找重複人(人)的訂單?如果是這樣的話,那麼這將這樣的伎倆:

Select DISTINCT orders1.OrderNo, persons.LastName, persons.FirstName 
FROM Persons 
LEFT JOIN Orders orders1 
    ON persons.P_ID = orders1.P_ID 
LEFT JOIN Orders orders2 
    ON persons.P_ID = orders2.P_ID 
Where orders1.P_ID = orders2.P_ID 

如果你只想要下單有一個單一的,特定的人,這是一個不同的查詢一起

3

其他答案告訴你刪除第二WHERE

他們沒有說的是,如果您要查找記錄1和2,則需要使用OR而不是AND。指定AND將會失敗,因爲查詢會查找符合兩個條件的單個記錄,在這種情況下這當然是不可能的。

所以你WHERE條款應該是這樣的:

WHERE OrderNo = 1 OR OrderNo = 2 
+0

或有效,但沒有我想要的。我需要得到OrderNo = 1和OrderNo = 2的記錄.1和2都一起計算。如果我使用OR,它會返回具有其中一個或兩個值的記錄。 – swoorn

+1

@ user955399,如果你想要一些非常具體的東西,請編輯問題以列出你想要的確切結果。 _(最好以表格的形式,就像你的問題中的table1一樣)_ – Johan

+0

@ user955399 - 同意;這個問題真的不清楚,這是你想要的。要在單個查詢中實現這一點,您需要徹底改變您加入表格的方式。就目前來看,你沒有一個OrderNo = 1和= 2的記錄;你有兩個記錄。可以重寫查詢以將兩個訂單號碼放入同一記錄中,但這可能不是一種明智的做法。僅僅收集匹配的兩條記錄並在SQL之外顯示/處理它們以滿足您的需求就容易得多。 – Spudley

0
WHERE OrderNo = 1 
AND WHERE OrderNo = 2 

你的規範是非常短暫的。

上面AND的關係等價物可能是UNION例如

SELECT * 
    FROM Orders 
WHERE OrderNo = 1 
UNION 
SELECT * 
    FROM Orders 
WHERE OrderNo = 2; 

可能的是,關係運算符分爲例如具有順序號1和2的任何人的返回姓名,例如,

SELECT DISTINCT LastName, FirstName 
    FROM Orders AS O1 
WHERE NOT EXISTS (
        SELECT OrderNo 
        FROM (VALUES (1), (2)) AS Divisor (OrderNo) 
        EXCEPT 
        SELECT OrderNo 
        FROM Orders AS O2 
        WHERE O2.LastName = O1.LastName 
          AND O2.FirstName = O1.FirstName 
       ); 

但我有些懷疑你的意思是邏輯或而非邏輯與(我知道是誰在自然語言中的單詞「和」寫sepcs業務分析師來表示邏輯或如「這可能是這一點,它可能那是「)例如

SELECT * 
    FROM Orders 
WHERE (OrderNo = 1 OR OrderNo = 2); 

SQL對這個漂亮的語法糖:

SELECT * 
    FROM Orders 
WHERE OrderNo IN (1, 2); 
0

我假設你希望誰同時擁有訂單1和2

您可以使用此查詢的人的名字:

SELECT LastName, FirstName 
FROM MyTable 
WHERE OrderNo IN (1, 2) 
GROUP BY LastName, FirstName 
HAVING COUNT(*) = 2 

注:我假設你不會有確切的重複記錄,如果你這樣做需要首先消除重複。