簡體   English   中英

左外連接缺少記錄

[英]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創建IdInName所有可能的不同組合,並對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.

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