Shorthand 用于比较复合键的表示法(在 PostgreSQL 中)

Shorthand notation for comparing composite keys (in 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);

我想为 a 中被 b 中至少一行引用的那些行获取 a1。例如。像这样:

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

是否有更短(且有效)的方式来表达这一点,最好是不需要我明确列出复合键中所有列的方式,因为该列表可能会更改?

您可以在 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,因为它使用两个表中具有相同名称的所有列。它不尊重已声明的外键关系,因此可能会 return 意外结果。