2016-08-11 82 views
0

我是編程和SQL的新手,非常抱歉,如果我沒有包含足夠的信息。SQL - 返回不包含特定行的表中的記錄組

[我有這2個表由一個OrderID鏈接。表1包括OrderID和客戶信息,例如名字,姓氏和地址。表2包括訂單ID和訂單詳細信息,如項目名稱,價格和數量。

每個訂單ID表2中可能具有相同的OrderID多個ITEMNAME條目。] 1

CustInfo

OrderID  FirstName LastName Address 
1   Bob   Pratt  123 
2   Jane  Doe   456 
3   John  Smith  789 
4   Barbara  Walters  147 

訂單

OrderID  ItemName Price  Quantity 
1   Milk  4.00  1 
1   Eggs  5.00  2 
2   Cheese  5.00  1 
2   Bread  5.00  1 
3   Milk  4.00  2 
4   Yogurt  5.00  2 

我試圖做一個查詢,將發回每個訂單的清單,列出OrderID和ItemName以及其他信息,只要該訂單不包含特定類型的物品(這會在ItemName中)。所以如果一個OrderID包含2個ItemName,其中一個是我不想要的,那麼整個訂單(OrderID)就不應該顯示在我的結果中。

例如,基於斷IMG包括,如果我想顯示所有的訂單,只要他們沒有牛奶作爲ITEMNAME,結果應僅顯示的OrderID 2和4

2 Cheese 5.00 1 
2 Bread 5.00 1 
4 Yogurt 5.00 2 

這是我嘗試過的,但是這將返回OrderIDs,即使Milk在技術上是該OrderID的一部分。

SELECT OrderID, FirstName, LastName, ItemName, Price, Quantity 
FROM CustInfo 
JOIN Orders 
ON CustInfo.OrderID = Orders.OrderID 
WHERE ItemName != 'Milk' 

你能幫忙嗎?

+1

歡迎SO;在這裏你可以找到一些有用的[問]和如何建立[mcve];一些出發點:將表格結構和樣本數據發佈爲格式化文本,而不是圖片,以便人們可以輕鬆構建測試用例,併發布您嘗試的結果,錯誤和問題。 PS:是oracle還是mysql? – Aleksej

+1

既然你說你是新手:[提出一個好的結構化查詢語言(SQL)問題](http://meta.stackoverflow.com/a/271056/4955425) – sstan

+1

我刪除了不一致的數據庫標記。請添加您實際使用的數據庫的標籤。 –

回答

1
select o.OrderID, o.ItemName, c.FirstName, c.LastName -- include other fields if needed 
from Orders o 
left join CustInfo c on o.OrderID = c.OrderID 
where o.OrderID not in (
    select OrderID from Orders where ItemName = 'Milk' 
) 
0
SELECT T1.OrderID, T1.FirstName, T1.LastName, T1.Address, T2.OrderID, T2.ItemName, T2.Price, T2.Quantity 
FROM Table2 as T2 
    LEFT JOIN Table1 as T1 ON T1.OrderID = T2.OrderID 
WHERE T2.OrderID <> (SELECT OrderID FROM Table2 WHERE ItemName='Milk'); 
+0

但是,您希望使用該項目的參數進行排除,而不是將其硬編碼。 –

+0

請解釋您的答案 –

+0

@SimonHänisch好的。選擇您希望在查詢結果中看到的項目,並且由於Table2包含的變量可以是我們用於FROM語句的排除因子。然後,我們加入表1中的信息,該信息包含與表2相同的orderID,並在這些匹配標準上進行左連接。然後,爲了回答他的問題,我們用牛奶排除結果作爲項目名稱 –

0

如果你想整個爲了顯示不出來,而不僅僅是單獨的行,您可以使用WHERE NOT EXISTS:

SELECT o.OrderID, d.ItemName, d.Price, d.Quantity 
FROM Orders o 
JOIN OrderDetails d ON o.OrderID=d.OrderID 
WHERE NOT EXISTS 
(
    SELECT * FROM OrderDetails d2 
    WHERE o.OrderID=d2.OrderID 
    AND d.ItemName = 'Milk' 
) 
+0

此外,完全猜測表/列的名稱。 – Simon

相關問題