2012-07-30 93 views
1


我有以下的一些示例數據的MySQL表。選擇所有記錄但排除關聯記錄

1)表:ai_shipment

+----+---------------------+---------------------+------------------+ 
| id | booking_date  | loading_date  | container_number | 
+----+---------------------+---------------------+------------------+ 
| 1 | 2012-08-03 00:00:00 | 2012-08-04 00:00:00 | ABB987987BBC6 | 
| 2 | 2012-08-05 00:00:00 | 2012-08-07 00:00:00 | BHJKKU78786GH | 
+----+---------------------+---------------------+------------------+ 

2)表:ai_purchase_item

+----+---------+----------+-----------+-----------+ 
| id | item_id | quantity | cost  | rate  | 
+----+---------+----------+-----------+-----------+ 
| 1 |  1 |  50 | 1200.0000 | 1355.0000 | 
| 2 |  2 |  20 | 550.0000 | 675.0000 | 
| 3 |  4 |  70 | 70.0000 | 70.0000 | 
| 4 |  6 |  90 | 90.0000 | 90.0000 | 
| 5 |  7 |  80 | 80.0000 | 80.0000 | 
+----+---------+----------+-----------+-----------+ 

3)表:shipment_purchase_item

+----+-------------+------------------+ 
| id | shipment_id | purchase_item_id | 
+----+-------------+------------------+ 
| 1 |   1 |    2 | 
| 2 |   2 |    3 | 
+----+-------------+------------------+ 

基本上我在ai_purchase_itemai_shipment存儲所有購買的物品的詳細信息,ai_shipment_purchase_item存儲物品的出貨記錄。

我想要做的是,我想選擇ai_purchase_item未發貨的所有記錄。這意味着外鍵不應該存在於ai_shipment_purchase_item中。

參考上面的記錄,我期待被取的結果是。

+----+---------+----------+-----------+-----------+ 
| id | item_id | quantity | cost  | rate  | 
+----+---------+----------+-----------+-----------+ 
| 1 |  1 |  50 | 1200.0000 | 1355.0000 | 
| 4 |  6 |  90 | 90.0000 | 90.0000 | 
| 5 |  7 |  80 | 80.0000 | 80.0000 | 
+----+---------+----------+-----------+-----------+ 

我想是這樣的(我知道SQL查詢是不恰當)

SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost, 
    pi.rate 
FROM 
    ai_purchase_item pi 
JOIN 
    ai_shipment_purchase_item spi ON spi.purchase_item_id = pi.id 
WHERE NOT EXISTS (SELECT spi.purchase_item_id WHERE spi.purchase_item_id = pi.id) 

謝謝。

回答

3

有用於在MySQL找到現值在一個表中,但缺少另外三個常用的方法:

  • LEFT JOIN
  • NOT EXISTS
  • NOT IN

下面是一個使用NOT EXISTS的方法:

SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost, 
    pi.rate 
FROM 
    ai_purchase_item AS pi 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM ai_shipment_purchase_item AS spi 
    WHERE spi.purchase_item_id = pi.id 
) 

這裏是一個LEFT JOIN

SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost, 
    pi.rate 
FROM 
    ai_purchase_item AS pi 
LEFT JOIN 
    ai_shipment_purchase_item AS spi ON spi.purchase_item_id = pi.id 
WHERE spi.purchase_item_id IS NULL 

而這裏的NOT IN

SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost, 
    pi.rate 
FROM 
    ai_purchase_item AS pi 
WHERE pi.id NOT IN 
(
    SELECT purchase_item_id 
    FROM ai_shipment_purchase_item 
) 

通過Quassnoi下面的文章中比較了每種方法的性能:

得出的結論是:

尋找失蹤MySQL中值的最佳方法是使用LEFT JOIN/IS NULL或NOT IN,而不是不存在。

+1

+1的所有解釋。 – diEcho 2012-07-30 10:43:39

+0

+1,爲偉大的答案,讓我試試:) – 2012-07-30 10:44:22

+0

謝謝你的鏈接。 – 2012-07-30 10:53:44

1
select * from ai_purchase_item where id not in (select distinct(purchase_item_id) from shipment_purchase_item)