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