0

我有以下查询

SELECT * 
FROM tableA, tableB
WHERE Conditions [+]

这个关键字Condition[+]代表什么?此查询如何作为外连接?

4

4 回答 4

6

那是旧的 Oracle Join 语法。

SELECT * 
FROM tableA, tableB
WHERE Conditions [+] -- this should be tableA (+) = tableB

符号的位置+表示JOIN语法。

如果您查询的是:

SELECT * 
FROM tableA, tableB
WHERE tableA.id (+) = tableB.Id

然后它会显示 aRIGHT OUTER JOIN 所以等价的是:

SELECT * 
FROM tableA
RIGHT OUTER JOIN tableB
   ON tableB.id = tableA.Id

如果+标志在另一边,那么它将是LEFT OUTER JOIN

SELECT * 
FROM tableA, tableB
WHERE tableA.id  = tableB.Id (+)

相当于

SELECT * 
FROM tableA
LEFT OUTER JOIN tableB
   ON tableA.id = tableB.Id

不过,我建议使用标准连接语法。

如果您不指定+符号,那么它将被解释为INNER JOIN

SELECT * 
FROM tableA, tableB
WHERE tableA = tableB

它的等价物是:

SELECT * 
FROM tableA
INNER JOIN tableB
    ON tableA.id = tableB.id

AFULL OUTER JOIN将使用两个SELECT语句和 a编写UNION

SELECT * 
FROM tableA, tableB
WHERE tableA.id  = tableB.Id (+)
UNION
SELECT * 
FROM tableA, tableB
WHERE tableA.id (+) = tableB.Id 

等效的是:

SELECT * 
FROM tableA
FULL OUTER JOIN tableB
    ON tableA.id = tableB.id

这是一个解释了很多这些的教程:

旧的外部连接语法

于 2012-08-17T15:46:10.270 回答
3

它的行为方式并不重要。您应该使用外部连接的标准语法:

select *
from tableA left outer join
     tableB
     on . . .

"(+)" 语法是 Oracle 在标准语法之前引入的,它已经非常过时了。

于 2012-08-17T15:40:58.367 回答
0

这里的“条件”仅表示您用于过滤所有这些数据的内容。

就像这里的一个例子:

SELECT * 
FROM tableA, tableB
WHERE Name like '%Bob%'

将返回内部任何地方都有“Bob”的名称。

关于外连接,实际上你会在 FROM 子句中使用它:

所以也许

SELECT * 
FROM tableA ta 
     OUTER JOIN tableB tb
     ON ta.name = tb.name
WHERE ta.age <> 10

顺便说一下,这里是可选的

于 2012-08-17T15:40:33.377 回答
0

我讨厌只是复制和粘贴答案,但是如果您进行一些搜索,就可以很容易地找到这种东西...

外连接返回一个表的行,即使另一个表中没有匹配的行。通过在 WHERE 子句中可选表中的列名后面的括号中放置一个加号 (+),您可以在 Oracle 中指定一个外连接。例如:

SELECT ut.table_name, uc.constraint_name 
FROM user_tables ut, user_constraints uc 
WHERE ut.table_name = uc.table_name(+);

uc.table_name 之后的 (+) 使 user_constraint 表是可选的。该查询返回所有表,并且在没有相应约束记录的情况下,Oracle 在约束名称列中提供空值。

于 2012-08-17T15:42:57.743 回答