2016-11-18 133 views
-1

通過內部連接和兩個相同列連接兩個表會給我們相同的響應。內部連接和列連接之間的區別

通過內部執行加入

select N.newsno , N.newsArticleno , E.empid , E.empsal 
    from News N inner join tblEmployee E on (E.empid = N.newsno); 

通過同一列執行連接這兩個表的

select N.newsno , N.newsArticleno , E.empid , E.empsal 
    from News N , tblEmployee E 
    where (E.empid = N.newsno); 

輸出相同。

所以,請給我解釋一下什麼是這個查詢,以及它如何在不同情況下使用 先謝謝了!!!之間的差異.....

+1

爲什麼標記爲c#,java,android,php? – Imad

+1

一個使用正確的顯式'JOIN'語法。另一個使用應該被廢棄的陳舊語法。 –

+1

今天提示:始終使用現代的,明確的'JOIN'語法。易於編寫(沒有錯誤),更易於閱讀和維護,並且在需要時更容易轉換爲外部聯接! – jarlh

回答

0

捧場8i中,只使用一個where子句:

select * from emp, dept where emp.deptno = dept.deptno; 

在9i和起來,你可以

select ename, dname, emp.deptno, dept.deptno from SCOTT.EMP inner join  SCOTT.DEPT on emp.deptno = dept.deptno 
+0

什麼是8i和9i? – jarlh

+0

@jarlh Oracle verisons –

2

按道理這些查詢是相同的。

第二個查詢使用舊語法。

首屆查詢使用,成爲1992年 標準它不僅支持INNER JOIN還有其它類型的連接,如LEFT語法JOIN和FULL JOIN,在此之前是由每個提供商不同的方式實現或沒有落實在所有。

我的建議是儘可能使用ANSI/ISO標準。

  • 它是人類可讀
  • 它支持更多的可能性
  • 它更乾淨,分離之間的連接條件和過濾條件
  • 它可以保護您忘記推杆連接條件

而且與舊語法相同,如果不是全部,則大多數提供者都支持它。

+0

也有'NATURAL JOIN'和'UNION JOIN'(儘管後者我沒有在野外見過)。說到丟棄舊版本的東西,標準於1987年成爲ISO,並不確定爲什麼我們仍然使用舊的'ANSI'綽號! – onedaywhen

+0

@onedaywhen我故意忽略NATURAL JOIN和RIGHT JOIN,因爲我不想看到它們在使用:-)我也忽略了LEFT SEMI JOIN,因爲它仍然不常見,並且AFAIK僅HQL(Hive及其衍生物)支持它。 –

0

您的查詢枚舉連接語法及時倒退。然而,你錯過了更多的現代版:NATURAL JOIN

WITH N AS (SELECT newsno AS empid, newsArticleno FROM News), 
    E AS (SELECT empid, empsal FROM tblEmployee) 
SELECT * 
    FROM N NATURAL JOIN E; 

的問題是舊的語法是永遠不會從SQL標準去除,SQL已經結束了與表達相同的查詢語義許多等效方法。另外,供應商通常採用新語法的速度很慢(例如,SQL Server仍然沒有NATURAL JOIN);很長一段時間的用戶覺得很難從他們最喜歡的編寫代碼的方式轉向(例如,您聽到「危險」語法的說法)。現實情況是,野外有許多編碼風格需要熟悉。

+0

NATURAL JOIN看起來像是一種很酷的語法,可以顯着簡化代碼**但是**想想在有一天某列正在被添加或重命名並且突然間所有代碼被「破壞」,返回錯誤結果的生產場景中。最重要的是,將列作爲「record_create_ts」和「record_update_ts」添加到每個表是很好的做法,這會使NATURAL JOIN無用。 –

+1

'NATURAL JOIN'是一個等待發生的錯誤。它*永遠不應該被添加到標準中。 –

+0

@GordonLinoff:已經涵蓋了這個,「你聽到'危險'語法的說法」哈哈。 – onedaywhen

相關問題