替代UNION子句

Zil*_*lch 1 sql oracle

我正在努力教自己,更好地了解UNION的替代方法,并发现何时可以使用连接.

当我正在玩这个时,如果没有UNION,我似乎无法得到我想要的东西.是否可以在一个查询中写这个?

SELECT DISTINCT a.id
  FROM table1 a, table2 b
 WHERE a.id = b.id
       AND a.ind IS NULL
       AND b.year >= '2017'
       AND b.code IN ('01','02','03')
       AND b.flag NOT IN ('F','L')
UNION
SELECT DISTINCT a.id
  FROM table1 a, table3 c
 WHERE a.id = c.id
       AND a.ind IS NULL
       AND c.area = 'MAIN'
       AND SYSDATE >= c.start
Run Code Online (Sandbox Code Playgroud)

在此先感谢任何指导或帮助.

Joe*_*orn 6

SELECT DISTINCT a.id
FROM table1 a
LEFT JOIN table2 b on b.id = a.id AND b.year >= '2017'
     AND b.code IN ('01', '02', '03') AND b.flag NOT IN ('F', 'L') 
LEFT JOIN table3 c ON a.id = c.id and c.area = 'MAIN' and SYSDATE >= c.start
WHERE a.ind IS NULL
    AND ( b.id IS NOT NULL or c.id IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

这是旧的过时A,B连接语法真正表明它的年龄的事情之一,当您有一些条件必须在特定ON子句中使用而其他条件必须在该WHERE子句中使用时。以这种方式编写此查询将非常困难,以后更难以阅读和理解。更好地总是写出完整的INNER JOINLEFT JOIN等等。


Ger*_*lle 5

每当你看到一个独特的,资源被浪费了.

SELECT a.id
  FROM table1 a
  where a.ind IS NULL
    and (   exists (select null from table2 b
                      WHERE a.id = b.id
                        AND b.year >= '2017'
                        AND b.code IN ('01','02','03')
                        AND b.flag NOT IN ('F','L') )
         or exists (SELECT null FROM table3 c
                      WHERE a.id = c.id
                        AND c.area = 'MAIN'
                        AND SYSDATE >= c.startdt)
        )
Run Code Online (Sandbox Code Playgroud)

table2(id,year,code,flag)和table3(id,area,startdt)上的索引不会影响性能.Oracle 11gR2不允许我有一个名为"start"的列.