SQL-将MSSQL查询重写为Oracle sql

时间:2018-11-27 08:33:23

标签: sql oracle

我有一个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)) )

能否请您帮我一些正确的重写方法,结果集更大的原因是什么?

2 个答案:

答案 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
             );

这也应该在任何数据库上起作用。

如果查询得到的结果不同,则最可能的原因是两个数据库中的数据不同。