SQL动态where子句基于父表列

时间:2016-07-28 11:56:52

标签: sql db2

我有以下两个表,需要一个具有这些要求的SQL(无UNION)。

如果CHECK_CHILDFALSE,则只返回Parent表中的行。 如果CHECK_CHILDTRUE,则检查CHILD表中是否有引用行并返回PARENT行。如果CHILD表中没有参考行,则不要返回PARENT行。

  PARENT Table
  ID           INT (PK)
  CHECK_CHILD  BOOLEAN

  CHILD TABLE
  ID          INT (PK)
  PARENT_ID   INT (FK)

示例数据:

    PARENT Table
    ------------
    ID    CHECK_CHILD
    1     FALSE
    2     TRUE
    3     TRUE

    CHILD Table
    -----------
    ID    PARENT_ID
    1     2

使用此示例数据,查询应返回PARENT表中的前两行,因为第三行在CHILD表中没有引用行。

1 个答案:

答案 0 :(得分:0)

有两种选择:

select P.* 
from PARENT P
left outer join CHILD C
  on C.PARENT_ID = P.ID
where P.CHECK_CHILD = 'FALSE'
   or C.PARENT_ID is not null

select * 
from PARENT P
where P.CHECK_CHILD = 'FALSE'
   or (
    P.CHECK_CHILD = 'TRUE' 
    and exists (select 1 from CHILD C where C.PARENT_ID = P.ID)
   )