我想检查表A是否有任何条目只检查表表B中存在一个列值。如果TableA中没有数据,那么只需从TableB获取数据。
我希望TableB选择查询的Exists子句当且仅当TablaA中有数据时,它才会是TableB的纯选择查询
内部联接不会起作用,因为TableA可能没有任何数据,甚至没有连接。
如何在单个查询中执行此操作?
类似的东西:
select Id from TableB where
if( select count(*) from TableA ) > 0 then Id in (select col from TableA)
答案 0 :(得分:0)
select b.id
from table_a a
, table_b b
where a.col = b.id
and a.col_val = 'XXX';
答案 1 :(得分:0)
select b.* from tableB b, tableA A
Where b.id = a.id
简单的连接就足够了。
其他方式是使用EXISTS
。把你的条件放在里面。
select * from tableB b
Where exists
(Select 'x' from tableA a
Where a.id=b.id)
修改强>
希望你需要这个。/* first part returns result only when tableA has data */
select b.* from tableB b, tableA A
Where b.id = a.id
Union
/* Now we explicitly check for presence of data in tableA,only
If not we query tableB */
Select * from tableB
Where not exists (select 'x' from tableA)
所以,只有查询的一部分会返回结果,同样的结果集,UNION
设置操作,才能完成。
如果有的话,你想要基于条件的结果,PL / SQL可能是一个很好的选择!
VARIABLE MYCUR REFCURSOR;
/* defines a ref cursor in SQL*Plus */
DECLARE
V_CHECK NUMBER;
BEGIN
SELECT COUNT(*) INTO V_CHECK
FROM TABLEA;
IF(v_CHECK > 0) THEN
OPEN :MYCUR FOR
select b.* from tableB b, tableA A
Where b.id = a.id;
ELSIF
OPEN :MYCUR FOR
select * from tableB;
END IF;
END;
/
/* prints the cursor result in SQL*Plus*/
print :MYCUR
答案 2 :(得分:0)
我认为这可能会对你有帮助,但我知道这不是最佳答案,
在我自己的理解中,你想要始终显示你的Table B
的记录并检查TableA
是否有记录找到他们的关系,但我认为如果你在{中有记录,则不需要计算是{1}},如果你使用LEFT JOIN并设置一些条件来过滤我的例子...
关于此查询Table A
中的所有数据都将显示,无论TableB
中是否存在关系,或者如果TableA
与TableA
有关系,则会显示所有数据关系的值,但如果TableB
中的记录在TableB
中没有关系,则会返回TableA
值,在这种情况下,您可以使用null
来过滤你想要什么
WHERE
如果您只想显示SELECT * FROM TableB B
LEFT JOIN Table A ON A.id = B.id
中所有TableB
关系的记录,请添加此
TableA