用于比较(PostgreSQL中)

用于比较(PostgreSQL中)

问题描述:

组合键速记符号我有两个表所示:用于比较(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

一个捷径,你可以在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'是非常危险的,从来不应该使用现有的语义添加到语言中。 –