2012-03-27 14 views
1

我想確定我是否應該使用WHERE,或與,或,如果它的問題:WHERE對戰和

FROM table1 

LEFT OUTER JOIN table3 
ON -------- 

JOIN table2 
ON -------- 
AND ------- 
AND -------- 
AND year = ii_year 

最後一行我還可以使用以下命令: 其中year = ii_year和我得到相同的結果。 我應該使用哪一個? 謝謝 其實我有一個LEFT OUTER JOIN

+0

讀http://stackoverflow.com/questions/354070/sql-join -where-clause-vs-clause 所有答案都是此線程的子集(包括其傳出鏈接;))。希望能幫助到你。 – instanceOfObject 2012-03-27 19:34:19

回答

1

(假設MySQL爲這個答案)。

如果這是一個INNER JOIN,就像你的例子,它沒有什麼區別。但是,如果您使用LEFT OUTER JOIN並將條件放在WHERE子句中,則它的行爲將類似於INNER JOIN

+0

我實際上有一個直接在FROM下的LEFT OUTER JOIN,之後有一對INNER JOIN。那麼你是否說因爲首先有一個LEFT OUTER JOIN,那麼以下WHERE子句中的任何內容都不再作爲LEFT OUTER JOIN? – doug 2012-03-27 19:26:23

+1

@doug:類似於SELECT * FROM LEFT OUTER JOIN b ON b.a_id = a.id WHERE b.type ='A''本質上起着INNER JOIN的作用,因爲結果集中的一行除非聯接成功,否則永遠不能滿足'b.type ='A''條件。但是像'SELECT * FROM LEFT OUTER JOIN b ON b.a_id = a.id WHERE a.type ='B''是非常好的。 – ruakh 2012-03-27 19:31:45

+0

謝謝@ruakh,很好的例子! – bfavaretto 2012-03-27 19:33:26

1

如果我正確理解你的問題,AND是當在WHERE聲明必須回報true兩個條件是有效的邏輯運算符。這是正確的語法:

SELECT column 
FROM table 
JOIN othertable ON ... 
WHERE (column > 10) AND (column2 < 1) 
0

我個人會使用最後一個WHERE子句。然後,您將ANDs用於加入表格的字段,並將WHERE用於篩選。

SELECT * 
FROM table1 t1 
    JOIN table2 t2 
    ON t1.field1 = t2.field1 
    AND t1.field2 = t2.field2 
    AND t1.field3 = t2.field3 
WHERE year = ii_year 
1

你問,如果你要編寫查詢這樣的:

SELECT 
FROM table1, table2 
WHERE table1.year = table2.year; 

對戰:

SELECT 
FROM table1 JOIN table2 ON table1.year = table2.year; 

沒有區別,從邏輯上說。而大多數解析器/查詢引擎會將它們視爲相同。拇指我使用的規則是這樣的:

  • 如果是爲了用來比較條件涉及兩個實體的地方,在一個JOIN條款
  • 如果比較的,而不是用來過濾器結果集,放置在一個WHERE條款

我發現,這兩個規則保持查詢更加清晰的意圖。在你的具體例子中,我需要更多的信息來真正決定它屬於哪個類別。

+1

這絕對不是* OP所要求的。 OP的查詢變體都使用ANSI連接。 – ruakh 2012-03-27 19:28:29

1

使用WHERE,保存ON關鍵字的連接表。這是迄今爲止更具可讀性,並使用OUTER JOIN時不會給你不想要的結果...

3

在之前WHERE條件過濾執行的查詢執行順序JOIN,所以加入的條件是某種結果集的預過濾的。

對於INNER JOIN這並沒有什麼區別,但是對於OUTER(左/右)呢。

1

從概念上說,區別在於ON條款指出了與兩個表格相關的條件(例如,ON table2.table1id = table1.id AND table2.is_active = 'Y'),而WHERE子句指示確定您實際需要哪些行的條件(例如WHERE table1.name LIKE 'Foo %' AND table1.type = 3)。

但是,正如您所觀察到的,這種差異在您使用INNER JOIN時沒有影響;它隻影響查詢結果,如果你有一個LEFT OUTER JOIN或什麼都不(如果ON條款中的失敗條件意味着你從table2中省略數據,而WHERE條款中的失敗條件意味着你從結果集中過濾出整行)。

所以,當你使用INNER JOIN時,你只需要決定哪種方式似乎是一種更直觀的方式來思考某種情況。並不總是有一個「正確的」答案。

0

乍一看,他們看起來很相似,但他們不是。加入多個條件可能會導致與連接和過濾(where語句)不同的數據集。

例如:

SELECT * FROM customer 
JOIN order ON customer.id = order.customerid 
WHERE customer.id = 10 

將返回所有訂單客戶ID是10

SELECT * FROM customer 
JOIN order ON customer.id = order.customerid AND order.id = 10 

將返回所有的客戶,但客戶10只訂單的詳細信息將被加入,其餘的將是空白(取決於所用的連接方法)

如果您正在使用INNER JOIN,那麼您可以使用任意一種,SQL優化程序將更改查詢以獲得最佳執行計劃。

如果您使用外部聯接,則返回的數據集將包含所有的客戶,每一個客戶除了ID = 10將具有NULL條目