簡體   English   中英

sql left join從left表中選擇所有記錄,即使rigth表中沒有記錄

[英]sql left join select all records from left table even if no records in rigth table

我正在嘗試運行以下查詢:

SELECT ifnull(sum(item_actual_qty),0) + b.item_opening_balance as closing
FROM transaction_inventory AS a 
LEFT JOIN inventory_master as b
ON b.item_code = a.item_code and b.company_code = a.company_code
WHERE a.item_Code = 2222
      AND a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
      AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
  AND a.trans_date < '2010-04-01' ;

即使transaction_inventory中沒有記錄,如何從stocking_master中選擇記錄? 目前,它的b.item_opening_balance值為空,應提供主表中的實際物料期初余額。

像這樣放置子查詢

SELECT ifnull(sum(item_actual_qty),0) +
(select item_opening_balance from inventory_master where item_code = a.item_code) as closing
FROM transaction_inventory AS a 
WHERE a.item_Code = 2222
  AND a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
  AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
  AND a.trans_date < '2010-04-01'

從ventory_master返回項目期初余額,但我避免使用子查詢

如果要從一個表中獲取所有記錄,則需要使用外部聯接。

select ifnull(sum(item_actual_qty),0) as aa,b.item_name,a.item_Code from  transaction_inventory AS a right outer join inventory_master as b
on b.item_code = a.item_code and b.company_code = a.company_code
WHERE  a.item_Code = 2222
       and a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
       AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
       AND a.trans_date < '2010-04-01' ;

如果對from子句重新排序,則還可以使用左外部聯接:

select ifnull(sum(item_actual_qty),0) as aa,b.item_name,a.item_Code from   inventory_master as b left outer join transaction_inventory AS a
on b.item_code = a.item_code and b.company_code = a.company_code
WHERE  a.item_Code = 2222
       and a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
       AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
       AND a.trans_date < '2010-04-01' ;

如果左表是返回所有記錄的表,則使用左外部聯接,而不管右表是否為空值;如果包含所有記錄的表在右邊,則使用右外部聯接。

正確加入

1-還將從transaction_inventory和NULL數據中獲取數據(與stocking_master匹配)。 2-將從inventory_master 獲取所有數據

SELECT ifnull(sum(item_actual_qty),0) as aa,b.item_name,a.item_Code 
FROM transaction_inventory AS a 
RIGHT JOIN inventory_master as b
ON b.item_code = a.item_code and b.company_code = a.company_code
WHERE a.item_Code = 2222
      AND a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
      AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
  AND a.trans_date < '2010-04-01' ;

* 完整的外部聯接為左右聯接的聯合*

1-將同時從transaction_inventory和NULL數據中獲取所有數據 2-還將從ventory_master和NULL數據中獲取所有數據

SELECT ifnull(sum(item_actual_qty),0) as aa,b.item_name,a.item_Code 
FROM transaction_inventory AS a 
LEFT OUTER JOIN inventory_master as b
ON b.item_code = a.item_code and b.company_code = a.company_code
WHERE a.item_Code = 2222
      AND a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
      AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
  AND a.trans_date < '2010-04-01' ;

UNION

SELECT ifnull(sum(item_actual_qty),0) as aa,b.item_name,a.item_Code 
FROM transaction_inventory AS a 
RIGHT OUTER JOIN inventory_master as b
ON b.item_code = a.item_code and b.company_code = a.company_code
WHERE a.item_Code = 2222
      AND a.company_code = '52889497-5b6b-403d-8f83-224e3c7759b4'
      AND a.trans_type_name NOT IN ('Sales Order','Purchase Order')
  AND a.trans_date < '2010-04-01' ;

由於無法使用完全聯接,因此您可以使用左右聯接並進行完全聯接,示例如下。 請檢查

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM