Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle语法中使用双条件进行左连接?_Sql_Oracle_Oracle11g_Oracle10g_Left Join - Fatal编程技术网

Sql 如何在Oracle语法中使用双条件进行左连接?

Sql 如何在Oracle语法中使用双条件进行左连接?,sql,oracle,oracle11g,oracle10g,left-join,Sql,Oracle,Oracle11g,Oracle10g,Left Join,我有两张桌子 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 p

我有两张桌子

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

但是当我用Oracle语法中的
(+)
符号而不是
左连接重写此查询时,我得到了不同的结果:

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

此查询的结果为空。我不明白如何用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连接相比,它只有缺点,没有优点(至少,我想不出任何优点)。事实上,我知道一个-如果你在旧的表单和报表6i中使用外部联接(或者更旧的?我认为现在没有人使用这些版本),他们的内置PL/SQL引擎可能不会说ANSI外部联接,因此你注定要使用旧的
(+)
外部联接操作符。除此之外。。。不,不知道。

那太好了

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连接相比,它只有缺点,没有优点(至少,我想不出任何优点)。事实上,我知道一个-如果你在旧的表单和报表6i中使用外部联接(或者更旧的?我认为现在没有人使用这些版本),他们的内置PL/SQL引擎可能不会说ANSI外部联接,因此你注定要使用旧的
(+)
外部联接操作符。除此之外。。。不,不知道。

(+)
!!!我从90年代就没见过了!我认为你应该进入21世纪,使用
左/右连接
。它给了你更多的灵活性。@Michael。“Oracle”语法现在是
左连接
,而不是
+
。(+)的文档和示例说明了什么?当您尝试使用给定的左表(+)时,情况如何?阅读手册(+)的重复使用和限制及其弃用。(+)位于左联接的所有右表列上,您使用的是错误的。PS谢谢。仅为方便补充文本和/或为文本中无法给出的内容使用图像。将代码作为文本放在帖子中。
(+)
!!!我从90年代就没见过了!我认为你应该进入21世纪,使用
左/右连接
。它给了你更多的灵活性。@Michael。“Oracle”语法现在是
左连接
,而不是
+
。(+)的文档和示例说明了什么?当您尝试使用给定的左表(+)时,情况如何?阅读手册(+)的重复使用和限制及其弃用。(+)位于左联接的所有右表列上,您使用的是错误的。PS谢谢。仅为方便补充文本和/或为文本中无法给出的内容使用图像。将代码作为文本放在帖子中。“为什么要使用旧的Oracle外部连接语法”-您可能希望在第一章中检查ansi与旧Oracle风格的比较:对于~15 GBP,我不介意您是否共享该信息(用几句话):@DrYWit。不幸的是,有一些Oracle功能不起作用(即使在Oracle 12.2中)使用ANSI join语法,它们也需要旧式(+)Oracle表示法。其中之一是具有快速刷新功能的(基于连接的)物化视图。啊哈。谢谢你,@mathguy。那么,如果其中一个表必须与两个(或更多)表进行外部连接,你(不是你个人;我是指Oracle)如何创建这样的视图呢?
(+)
只允许外部连接到一个表……除了@mathguy已经说过的之外,从Oracle 12第1版开始,(+)允许一个表与其他两个表进行外部联接。鉴于2014年夏季发布了12.1,此功能可用4年以上。还有一点是,Oracle不断改进本机语法,尽管ANSI在大多数情况下更可取。“为什么要使用旧的Oracle外部联接语法?”-在这里的第一章中,您可能想查看ansi与旧oracle风格的全面比较:对于~15 GBP,我不介意您共享该信息(用几句话来说),@DrYWit。不幸的是,有一些oracle功能(即使在oracle 12.2中)与ansi连接语法不起作用,它们需要旧样式(+)Oracle表示法。其中之一是具有快速刷新功能的(基于连接的)物化视图。啊哈。谢谢你,@mathguy。那么,如果其中一个表必须与两个(或更多)表进行外部连接,你(不是你个人;我指的是Oracle)如何创建这样的视图呢?
(+)
只允许外部连接到一个表……除了@mathguy已经说过的之外,从Oracle 12第1版开始,(+)允许一个表与其他两个表进行外部连接。鉴于2014年夏天发布了12.1,此功能可用4年以上。还有一点是,Oracle不断改进本机语法,尽管ANSI在大多数情况下更可取。