当WHERE子句在详细表中时从主表查询

时间:2014-12-05 00:04:25

标签: sql oracle10g

我正在尝试从Oracle DB查询一些数据,但我无法弄清楚如何执行此操作。

我有两张桌子:

TableMain                              TableDetail

id    col1    col2 ...                 id     info
------------------------               ---------------
01    xxx     xxx                      01     AAA
02    yyy     yyy                      01     BBB
03    zzz     zzz                      02     AAA
04    iii     iii                      03     BBB

我的目标是从TableMain中选择infoTableDetail所有等于用户指定的特定字符串的行。

例如:

(1)如果用户指定AAA,则应从01返回行02TableMain

(2)如果用户指定BBB,则应从01返回行03TableMain

(3)如果用户未指定任何内容,则应从01

返回行020304TableMain

我知道我可以使用下面的WHERE子句来处理示例(3)

AND(:info IS NULL OR info = :info)

我尝试使用

SELECT *
FROM
    (SELECT *
    FROM TableDetail
    WHERE 1=1
          AND(:info IS NULL OR info = :info)) a,
    TableMain b
WHERE a.id = b.id

但如果TableDetail中没有针对特定ID的条目,则会失败。

例如:如果用户没有为info指定任何内容,则此查询将返回缺少01的行020304这不正确。

请帮我解决这个问题,谢谢!

2 个答案:

答案 0 :(得分:1)

您需要exists子句:

select m.*
from tablemain m
where exists (select 1
              from tabledetail d
              where d.id = m.id and
                    d.info = :info
             ) or
      :info is null;

这会将null比较移动到外部查询中以获取所有行。

答案 1 :(得分:1)

尝试:

SELECT *
FROM TableMain main
WHERE (:info IS NULL OR EXISTS(
    SELECT 1
    FROM TableDetail detail
    WHERE main.id = detail.id
    AND detail.info = :info)
)