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