簡體   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