Join
如何在 SQL 中編寫雙重自然聯接?
讓我們成為以下數據庫:
- 產品(建構子、模型、類型)
- PC(型號、速度、RAM、HD、CD、價格)
- 筆記型電腦(型號、速度、記憶體、高畫質、螢幕、價格)
- 列印機(型號、顏色、類型、價格)
誰是給列印機和 PC 的建構子?
我認為關係代數的答案是:
Π建構子(產品⋈筆記型電腦⋈列印機)
但是我不知道如何用 SQL 編寫它,它會是:
SELECT Constructor FROM Product NATURAL JOIN Laptop NATURAL JOIN Printer;
你的問題有點不清楚——“類型”欄位是否指定了“PC”、“筆記型電腦”或“列印機”——如果是這樣,它相對容易——根本不需要加入——只需
SELECT * -- or whatever FROM Product WHERE Type = 'PC' OR Type = 'Printer'
如果 ‘Type’ 不是上面的,那麼它會比較棘手,但不會太難。順便說一句,‘Type’ 是
keyword
一些 RDBMS 產品中的一個 - 我建議將其更改為 ‘p_Type’ 或類似的。為了解決這個問題,我做了以下(SQLFiddle here):
我沒有設置參考約束——我把它留給你自己練習:-)(特別是因為你沒有提供你的特定 RDBMS)。我還排除了非連接欄位(對我來說少打字:-))
CREATE TABLE Product ( Constructor INT NOT NULL, Model VARCHAR(5) NOT NULL, Type VARCHAR(5) NOT NULL ); CREATE TABLE PC ( Model VARCHAR(5) NOT NULL ); CREATE TABLE Laptop ( Model VARCHAR(5) NOT NULL ); CREATE TABLE Printer ( Model VARCHAR(5) NOT NULL ); INSERT INTO Product VALUES( 1, 'm_1', 't_1'); INSERT INTO Product VALUES( 2, 'm_2', 't_1'); INSERT INTO Product VALUES( 3, 'm_3', 't_2'); INSERT INTO Product VALUES( 4, 'm_4', 't_3'); INSERT INTO PC VALUES('m_1'); INSERT INTO PC VALUES('m_2'); INSERT INTO Laptop VALUES ( 'm_3'); INSERT INTO Printer VALUES ('m_4');
查詢:
SELECT * -- or whatever FROM Product JOIN PC ON PC.Model = Product.Model UNION SELECT * -- or whatever FROM Product JOIN Printer ON Printer.Model = Product.Model
結果:
Constructor Model Type Model 1 m_1 t_1 m_1 2 m_2 t_1 m_2 4 m_4 t_3 m_4
等等 - 正確的結果 - 除非我誤解了你?