![](/img/trans.png)
[英]How to select all rows from tableA where two correlating columns in tableB are identical to the ones in tableA
[英]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.