我有2张桌子。
1)车牌:
2)参数表:
我需要获取具有所有者参数匹配的重复车辆并且保险不相同(这必须是相同的或两者都不存在)。
我用ANSI语法中的LEFT JOIN
成功执行了我的查询:
SELECT owner.name, owner.value, COALESCE (insur.name, 'insurance'), insur.value, count(*)
FROM car INNER JOIN param owner ON car.id = owner.car_id
LEFT JOIN param insur ON car.id = insur.car_id AND insur.name = 'insur'
WHERE owner.name = 'owner'
GROUP BY owner.name, owner.value, insur.name, insur.value
HAVING count(*) > 1
SQL Fiddle with properly working ANSI-syntax
但是,当我用来自Oracle语法的(+)
符号重写此查询而不是LEFT JOIN
时,我得到了不同的结果:
SELECT owner.name, owner.value, COALESCE (insur.name, 'insurance'), insur.value, count(*)
FROM car,
param owner,
param insur
WHERE car.id = owner.car_id
AND owner.name = 'owner'
AND car.id (+) = insur.car_id -- key change
AND insur.name = 'insur'
GROUP BY owner.name, owner.value, insur.name, insur.value
HAVING count(*) > 1
SQL Fiddle with unexpected result of (+) instead LEFT JOIN
此查询的结果为空。我不明白如何在Oracle语法中重写它以获得相同的查询结果。
那就是
SQL> select owner.name, owner.value,
2 coalesce (insur.name, 'insurance') in_name,
3 insur.value, count(*)
4 from car, param owner, param insur
5 where car.id = owner.car_id
6 and car.id = insur.car_id (+)
7 and insur.name (+) = 'insur'
8 and owner.name = 'owner'
9 group by owner.name, owner.value, insur.name, insur.value
10 having count(*) > 1;
NAME VALUE IN_NAME VALUE COUNT(*)
-------- -------- -------------------- -------- ----------
owner John insurance 2
SQL>
但是,为什么要使用旧的Oracle外连接语法?与ANSI连接相比,它只有缺点而没有优势(至少,我想不出任何优点)。实际上,我知道一个 - 如果你在旧的Forms和Reports 6i中使用外连接(甚至更老?我认为现在没有人使用这些版本),他们的内置PL / SQL引擎可能不会说ANSI外连接所以你注定要使用旧的(+)
外连接运算符。除此之外......不,不知道。