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 意外结果。
我有两个这样的表:
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 意外结果。