我正在努力教自己,更好地了解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)
在此先感谢任何指导或帮助.
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 JOIN,LEFT JOIN等等。
每当你看到一个独特的,资源被浪费了.
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"的列.