2014-06-16 91 views
-6

我想知道爲什麼聯合聲明非常流行,因爲許多字段可能在結果行中被複制。爲什麼使用連接語句?

Supplier(id, name, address) 
Product(id, name, detail) 
Product_Supplier(id, productId, supplierId, quantity) 

SELECT Product.*, 
     Product_Supplier.supplierId, 
     Product_Supplier.quantity 
FROM Product 
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId 

結果可能是這樣的:

Product.id Product.name Product.detail Product_Supplier.supplierId Product_Supplier.quantity 
1   'Product 1' 'bla bla'  100       20 
1   'Product 1' 'bla bla'  101       30 
1   'Product 1' 'bla bla'  102       20 
1   'Product 2' 'bla bla'  100       120 

所以,如果product.detail大文本,然後性能會慢下來,對不對?如果這是真的,爲什麼加入聲明很受歡迎?

+4

*我不知道爲什麼加入語句很受歡迎*?有沒有趨勢? – Raptor

+0

[this]的可能重複(http://stackoverflow.com/questions/2241991/in-mysql-queries-why-use-join-instead-of-where) –

+0

使用別名重命名輸出列名稱。 – Bohemian

回答

1

加入是在一個聲明中得到從不同的來源(表,函數,視圖等)數據的唯一途徑。

考慮您的樣品,你怎麼會得到從產品供應商和產品沒有加入所有的信息?

當然,你可以有多個表格,差異不是很大。當關系變得複雜時,聯結非常有用。

如果你有名字的碰撞麻煩,添加別名:

SELECT Product.id product_id 
,  ... 
FROM Product 
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId 

考慮您的性能標籤:連接並不總是更好的執行,然後在有多個表。例如Oracle在視圖關係和ANSI連接中存在一些問題。

+0

感謝您的回答。我想獲取所有產品的信息,然後獲取其他信息,如數量,供應商ID ......我使用join僅使用一條sql語句執行所有工作。那麼這是一個好方法嗎?因爲如果我選擇這種方式,許多列字段是重複的(如'bla bla'...)? – user3621203

+0

你不能阻止。這只是它的工作方式,並且運氣好一點,數據庫的傳輸層在複製過程中過濾掉這些重複項。 –

+0

在我上面描述的問題中,我應該只使用一個連接語句還是使用多個select:首先獲取所有產品,然後從具有產品ID的'Product_Supplier'中選擇?哪個更好,更方便? – user3621203

3

JOIN不流行,需要用來自多個表格的數據來組合結果。

比方說你有一個產品和其他與銷售表,並且要開發其所有的產品是賣的賣,包括細節生成報告的程序。你需要撰寫每一行,如何?你可以在你的程序中使用查詢和中間數據結構,或者你可以問你數據庫爲你做。因此加入兩個表。

在你的情況下,如果product.detail過大,你不希望它在你的結果你應該避免它包含在所選列。喜歡的東西:

SELECT Product.name, 
    Product_Supplier.supplierId, 
    Product_Supplier.quantity 
FROM Product 
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId 

相反SELECT Product.* ...

+0

感謝您的回答。但我必須達到2個目標:1.獲得產品的所有信息; 2.獲取其他信息,如:數量......因此,如果我使用連接語句,我會遇到麻煩:如果包含產品表的所有列,則許多列會被複制,如果它們很大或者如果我不包含它們,我無法實現第一個目標。有沒有更好的方法? – user3621203