![](/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.