Sql WHERE子句位于详细表中时从主表查询

Sql WHERE子句位于详细表中时从主表查询,sql,oracle10g,Sql,Oracle10g,我正在尝试从Oracle DB查询一些数据,但我不知道如何执行此操作 我有两张桌子: TableMain TableDetail id col1 col2 ... id info ------------------------ --------------- 01 xxx xxx 01 AAA

我正在尝试从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
中选择所有行,其中
info
TableDetail
中等于用户指定的特定字符串

例如:

(1) 如果用户指定
AAA
,它应该从
TableMain

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

(3) 如果用户未指定任何内容,则应从
TableMain
返回行
01
02
03
、和
04

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

我试着用

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
02
03
,该行缺少
04
,且不正确


请帮我回答这个问题,谢谢

您想要一个
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
比较移到外部查询中,以获取所有行。

尝试:

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

非常感谢。你的答案也行,但戈登先得到了+从我这里得到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)
)