繁体   English   中英

SELECT * FROM tableA,tableB在哪里条件[+]

[英]SELECT * FROM tableA, tableB WHERE Conditions [+]

我有以下查询

SELECT * 
FROM tableA, tableB
WHERE Conditions [+]

此关键字Condition [+]代表什么? 此查询如何表现为外部联接?

那是旧的Oracle Join语法。

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

+号的位置表示JOIN语法。

如果查询是:

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

然后它将显示一个RIGHT 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

将使用两个SELECT语句和一个UNION来编写FULL OUTER JOIN

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

这是一个教程,其中解释了很多这些:

旧的外部联接语法

行为如何并不重要。 您应该对外部联接使用标准语法:

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

Oracle在标准语法之前引入了“(+)”语法,并且它已经过时了。

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

举个例子:

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

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

我讨厌只复制并粘贴答案,但是如果您稍作搜索,就可以很容易地找到这种东西……

外部联接返回一个表的行,即使另一表中没有匹配的行也是如此。 您可以通过在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在约束名称列中提供一个空值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM