我有一个SQL查询:
SELECT *
FROM Table_1
WHERE (0 < (SELECT COUNT(Table_2.ID)
FROM Table_2 inner join Table_3
on Table_2.ID= Table_3.A_ID AND Table_3.B_ID = Table_1.ID))
它在Microsoft SQL上可以正常工作,但是我必须将其写到Oracle sql,在这里它不起作用,因为Table_1不在子查询中。
我试图重写它,但是以重写后的形式它给出了20060行,而原始sql的结果中只有497行。
其中一个被重写:
SELECT *
FROM Table_1
WHERE (0 < (SELECT COUNT(Table_2.ID)
FROM Table_2 inner join Table_3
on Table_2.ID = Table_3.A_ID
AND Table_3.B_ID IN (SELECT Table_1.ID FROM Table_1)) )
能否请您帮我一些正确的重写方法,结果集更大的原因是什么?
答案 0 :(得分:1)
基本的EXISTS
查询有效吗?
SELECT *
FROM Table_1
WHERE EXISTS (SELECT 1
FROM Table_2 inner join Table_3
on Table_2.ID = Table_3.A_ID AND Table_3.B_ID = Table_1.ID)
或IN
:
SELECT *
FROM Table_1
WHERE ID IN (SELECT Table_2.ID
FROM Table_2 inner join Table_3
on Table_2.ID = Table_3.A_ID)
答案 1 :(得分:1)
这是标准 SQL,尽管我将关联子句放在WHERE
中:
SELECT *
FROM Table_1
WHERE 0 < (SELECT COUNT(Table_2.ID)
FROM Table_2 INNER JOIN
Table_3
ON Table_2.ID = Table_3.A_ID
WHERE Table_3.B_ID = Table_1.ID
);
这应该在两个数据库中都有效。
但是,我会使用EXISTS
来写这个:
SELECT *
FROM Table_1
WHERE EXISTS (SELECT 1
FROM Table_2 INNER JOIN
Table_3
ON Table_2.ID = Table_3.A_ID
WHERE Table_3.B_ID = Table_1.ID
);
这也应该在任何数据库上起作用。
如果查询得到的结果不同,则最可能的原因是两个数据库中的数据不同。