Join

如何在 SQL 中編寫雙重自然聯接?

  • July 27, 2021

讓我們成為以下數據庫:

  • 產品(建構子、模型、類型)
  • 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

等等 - 正確的結果 - 除非我誤解了你?

引用自:https://dba.stackexchange.com/questions/166244