如果为空,则SQL查询不返回行

时间:2016-11-28 08:25:21

标签: sql oracle

我是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

非常感谢任何帮助。谢谢!

2 个答案:

答案 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只有pidid相关联。

assoc表似乎是用于在关系数据库中的两个实体之间实现association tablemany-to-many relationship

它仅包含一个表中与另一个表中的实体关系的实体的条目。它不包含有关不在关系中的实体的信息,并且您希望获得的某些结果来自不在关系中的实体。

问题的解决方案是RIGHT JOINid所来自的表,并将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)