我正在尝试从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
,则应从01
返回行02
和TableMain
(2)如果用户指定BBB
,则应从01
返回行03
和TableMain
(3)如果用户未指定任何内容,则应从01
02
,03
,04
和TableMain
我知道我可以使用下面的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
的行02
,03
和04
这不正确。
请帮我解决这个问题,谢谢!
答案 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)
)