[英]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.