這是寫三個自然連接的正確方法嗎? :如何做3表自然加入?
SELECT C.name, P.name
FROM client C NATURAL JOIN order O NATURAL JOIN product P
WHERE O.date > '15.02.2011'
這是寫三個自然連接的正確方法嗎? :如何做3表自然加入?
SELECT C.name, P.name
FROM client C NATURAL JOIN order O NATURAL JOIN product P
WHERE O.date > '15.02.2011'
這實際上是自然連接的典型語法。然而,並不是所有的數據庫都支持自然連接(例如,我不相信SQLServer支持它),我不相信有自然連接的ANSI標準。
請注意,自然連接通常被認爲是危險的,需要避免的事情 - 這是因爲它們掩蓋了查詢所依賴的連接關係,並且可能導致查詢的含義在數據模型發生更改時發生變化。
NATURAL JOINs可悲的是ANSI,但我同意他們應該避免。 – 2011-02-28 21:12:54
+1:同意,(imho)邏輯應該明確而不是隱含的。因此,使用INNER JOIN來代替。 – MatBailie 2011-02-28 21:14:06
'NAUTRAL JOIN'是有效的SQL-92語法。在真正的關係數據庫管理系統中,「NATURAL JOIN」是唯一需要的連接。任何工具在不法之徒中都是危險的。 – onedaywhen 2011-03-01 08:47:47
使用此語法被認爲是危險的,因爲它已被提及。請看下面的例子: T1(ID,姓名,年齡) T2(ID,年齡,市)
SELECT T1.id, T1.name, T1.age, T2.age
FROM T1 NATURAL JOIN T2
哪一列應該被用於加入?身份證還是年齡?它沒有被定義。每個供應商都可以實現他自己的方式來解決這些問題。
代替此語法,可以考慮使用傳統的聯接語法:
SELECT T1.....
FROM T1 INNER JOIN T2 on T1.id=T2.id
你解決了這個問題?供應商正確實施'NATURAL JOIN'應該促進更好的模式設計。你的是一個稻草人的論點。你的'INNER JOIN'語法是SQL-92(和'NATURAL JOIN'一樣)。我會認爲「傳統的」等效連接語法是「FROM T1,T2 WHERE T1.id = T2.id'。 – onedaywhen 2011-03-01 08:49:05
儘管NATURAL JOIN在SQL-92中是標準的,但一些領先DBMS的供應商不支持它。使用你的「傳統」語法不如我的常見。我應該寫「常用」,而不是「傳統」來描述我的意思。 – 2011-03-01 09:51:05
要檢查語法,當你選擇的SQL產品不支持它,使用Mimer SQL-92 validator。您應該發現order
和date
是保留字。將它們分別更改爲my_order
和my_date
,然後您將發現您的SQL語法是有效的過渡SQL-92語法。
你正在使用什麼類型的數據庫? (SQL Server,MySQL等) – dana 2011-02-28 20:55:41
舊的mysql服務器 – 2011-02-28 20:55:59
@dana,SQL Server中沒有'自然連接'。 – Pacerier 2015-05-10 07:06:59