2013-05-14 87 views
0

我有2個表:如何選擇ID在一個表中存在的行,但不是另一個表中的行?

1)一種順序表(其具有OrderNumber作爲ID)

2),它可以具有多個行的相關文件表,並且還具有一個OrderNumber列捆紮每一行中的ord呃上面排。

大多數訂單在Items表中有多行 - 但有些不需要,我需要拉取Orders的報表而沒有關聯的Items行。

我可以在我的PHP的2個查詢中做到這一點,但顯然有更聰明的方法來在MySQL中做到這一點。我瞭解JOINS,但通常這是兩個表中都有數據的時候。如果兩者都沒有聯繫,我該如何解決這個問題?

+0

您想要從訂單表中獲取記錄,並且沒有匹配項目表中的記錄? – zamil 2013-05-14 11:26:38

回答

3

我會用一個LEFT OUTER JOIN或FULL OUTER JOIN,這取決於你所需要的..如果您發佈的2個查詢,或一些示例數據這將有助於...

OUTER處理該ISN任何數據「T有

這裏是來幫助你的鏈接:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

+0

SELECT * 從訂單 LEFT OUTER JOIN項目ON Order.OrderNumber = Items.OrderNumber – 2013-05-14 11:11:21

+0

感謝您的指導和片段。工作得很好,教給我的不僅僅是我通常在這裏做的複製和粘貼(懶惰就是這樣)。 – 2013-05-14 11:46:50

0

你可以使用該NOT IN短語where子句。這將會獲得訂單記錄的ID不在Items表中。

SELECT * FROM Order WHERE Id NOT IN (SELECT OrderNumber FROM Items) 
+1

聯接比子查詢更快。數據庫101. – 2013-05-14 11:38:40

+0

的確,但目標是獲得哪些訂單沒有物品的結果集,而不是訂單的記錄和不是他們的物品的記錄。邏輯101.一個左外連接將給你一個更大的數據集來處理,然後需要一個where條件剔除。有時候一個可讀的解決方案更適合,尤其是對於SQL初學者。 – 2013-05-14 11:58:54

+0

您對「更大的數據集」的聲明是錯誤的,因爲輸出與適當的WHERE限制相同。此外,子查詢將最有可能轉換爲臨時表,併爲每個訂單條目評估一次,並相信我會得到一個很大的數據集來提取信息。這更可讀嗎?真正。這是一個初學者的好建議嗎?不。 – 2013-05-14 12:44:22

1

讓我們假設你的Items表的主鍵是Items_Id

SELECT * FROM Orders LEFT JOIN Items USING (`OrderNumber`) where Items.Items_Id IS NULL 
1

除了上面列出的方式,我會說,我會使用這樣的結構:

SELECT * FROM Order where not exists (SELECT NULL FROM Items where OrderNumber = Orders.OrderNumber); 

您還可以在項目的OrderNumber列中添加索引以獲得更好的性能:

CREATE INDEX Idx_Items on Items (OrderNumber); 
+0

聯接比子查詢更快。數據庫101. – 2013-05-14 11:39:05

+0

謝謝!創建索引查詢是必不可少的,因爲我的系統陷入困境。乾杯! – 2013-05-14 11:47:55

+0

是的,連接速度更快,但首先並不總是,其次它們有時不可用(例如在動態sql中,例如當您需要添加一些動態過濾器時)。 – ZZa 2013-05-15 05:02:33

相關問題