2016-08-18 37 views
0

組合鍵速記符號我有兩個表所示:用於比較(PostgreSQL中)

CREATE TABLE a (a1 TEXT, a2 INTEGER, a3 INTEGER, 
    PRIMARY KEY (a2, a3)); 
CREATE TABLE b (b1 TEXT, b2 INTEGER, b3 INTEGER, 
    FOREIGN KEY (b2, b3) REFERENCES a); 

我想獲得a1用於由至少一排在b引用在a那些行。例如。像這樣:

SELECT a1 FROM a 
WHERE EXISTS (SELECT * FROM b WHERE a.a2 = b.b2 AND a.a3 = b.b3); 

是否有一個更短的(和有效)的方式來表達這一點,最好一個,不會要求我列出的所有列在組合鍵明確,該列表可能會改變?

+1

我不相信有一種方法可以在列的名稱不同時在單個查詢中執行此操作。 –

+0

@GordonLinoff如果列名匹配,可以做些什麼? – Drux

回答

2

一個捷徑,你可以在Postgres的做的是:

SELECT a1 
FROM a 
WHERE (a.a2, a.a3) IN (SELECT b.b2, b.b3 FROM b) ; 

當然,你還必須列出鍵。

如果b沒有重複如果列名是一樣的,你可以這樣做:

SELECT a1 
FROM a JOIN 
    b 
    USING (a2, a3); 

隨着USING,你只需要列出鍵一次。

我毫不猶豫地說這一點,但你也可以進一步減少這種使用NATURAL JOIN,假設公共密鑰具有相同的名稱並沒有其他的列具有相同的名稱

SELECT a1 
FROM a NATURAL JOIN 
    b; 

然而,我強烈不鼓勵使用NATURAL JOIN,因爲它使用兩個表中具有相同名稱的所有列。它不尊重已聲明的外鍵關係,因此它可以返回意外的結果。

+1

非常好。也同意:在這種情況下,我不會使用NATURAL JOIN。 – Drux

+0

非常好但不同意'NATURAL JOIN'應該不鼓勵。我的意思是,內部連接也不「尊重所聲明的外部關係」。這就是說,如果我在SQL Server中有'NATURAL JOIN',我可能會避免所有其他的連接類型! – onedaywhen

+0

@onedaywhen。 。 。內部連接不會「任意地」爲連接條件選擇未看到的列。 'NATURAL JOIN'是非常危險的,從來不應該使用現有的語義添加到語言中。 –