[英]left outer Join missing records
我試圖在我的PartsOnHand中列出缺少的記錄。 如果我的庫存表列出了一個項目,但它與我的PartsOnHand沒有關系,我想列出每個記錄中缺少的項目。
這是我嘗試使用的查詢:
select *
from inventory i
left outer join PartsOnHand ph on i.InName = ph.InName
我的表結構如下:
庫存:
InName
-----------
Wrench
Hammer
Pen
零件:
id Inname
------------------
505 Hammer
505 Wrench
501 Wrench
501 Hammer
所需結果:
505 Pen
501 Pen
樣本數據:
Select *
FROM (
with inventory as (
select 'Wrench' as InName from dual
union
select 'Hammer' from dual
union
select 'Pen' from dual
), partsonhand as (
select '505' as id, 'Wrench' InName from dual
union
select '505' as id, 'Hammer' InName from dual
union
select '501' as id, 'Wrench' InName from dual
union
select '501' as id, 'Hammer' InName from dual
)
select *
from inventory i
left outer join PartsOnHand ph on i.InName = ph.InName
)
您可能還有一個帶有列ID(主鍵,PartsOnHand中的列ID指向它)的附加表ALL_ID,這是正確的設置。 或者,您希望從表PartsOnHand中讀取ID。 我假設是前者; 如果是后者,則可以通過從PartsOnHand中選擇不同的ID將ALL_ID創建為子查詢。
select id, inname
from all_id cross join inventory
where (id, inname) not in (select id, inname from partsonhand)
;
這假設在PartsOnHand中沒有NULL(不應有NULL-否則會出現數據問題)。
您可以通過CROSS JOIN
創建Id
和InName
所有可能的不同組合,並對InName
進行RIGHT JOIN
來做到這一點:
Select L.*
From PartsOnHand P
Right Join
(
Select Id, InName
From Inventory I
Cross Join
(
Select Distinct Id
From PartsOnHand P
) X
) L On L.id = P.id
And L.InName = P.InName
Where P.id Is Null
結果:
Id InName
501 Pen
505 Pen
將相同的ID分配給不同的名稱似乎很奇怪...(我怎么知道Pen的ID是505和501?),但是在示例中可以達到預期的效果:
with inventory as (
select 'Wrench' as InName from dual
union
select 'Hammer' from dual
union
select 'Pen' from dual
), partsonhand as (
select '505' as id, 'Wrench' InName from dual
union
select '501' as id, 'Hammer' InName from dual
union
select '505' as id, 'Wrench' InName from dual
union
select '501' as id, 'Hammer' InName from dual
)
select C.ID, I.InName
from inventory i
LEFT join partsonhand P
on I.Inname = P.InName
cross join (Select distinct ID from partsonHand) C
Where P.ID is null
order by ID Desc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.