我是SQL的新手,我希望能够对我的问题有所了解 我使用以下查询,
select id,
pid
from assoc
where id in (100422, 100414, 100421, 100419, 100423)
所有这些id都不需要pid,有些没有pid,有些没有pid。目前它会跳过没有pid的记录。 我想要一种能够显示如下结果的方法。
pid id
-----------
703 100422
313 100414
465 100421
null 100419
null 100423
非常感谢任何帮助。谢谢!
答案 0 :(得分:2)
哦,我想我已经明白了:你必须枚举所有id
和相应的pid
。如果没有相应的 pid
,请添加null
(外部联接的种类)。如果是您的情况,那么Oracle解决方案可以是:
with
-- dummy: required ids
dummy as (
select 100422 as id from dual
union all select 100414 as id from dual
union all select 100421 as id from dual
union all select 100419 as id from dual
union all select 100423 as id from dual),
-- main: actual data we have
main as (
select id,
pid
from assoc
-- you may put "id in (select d.id from dummy d)"
where id in (100422, 100414, 100421, 100419, 100423))
-- we want to print out either existing main.pid or null
select main.pid as pid,
dummy.id as id
from dummy left join main on dummy.id = main.id
答案 1 :(得分:0)
id
来自其他表格,而assoc
只有pid
与id
相关联。
assoc
表似乎是用于在关系数据库中的两个实体之间实现association table的many-to-many relationship。
它仅包含一个表中与另一个表中的实体关系的实体的条目。它不包含有关不在关系中的实体的信息,并且您希望获得的某些结果来自不在关系中的实体。
问题的解决方案是RIGHT JOIN
列id
所来自的表,并将WHERE
条件与原始表中检索的值放在一起(因为它包含行你需要)。 RIGHT JOIN
确保右侧表中的所有匹配行都包含在结果集中,即使它们在左侧表中没有匹配的行也是如此。
假设id
列来自的表名为table1
,您需要的查询是:
SELECT assoc.id, assoc.pid
FROM assoc
RIGHT JOIN table1 ON assoc.id = table1.id
WHERE table1.id IN (100422, 100414, 100421, 100419, 100423)