类似的东西SELECT * except column foo FROM ...
不存在。但是您可以使用自然连接,从而消除冗余列。你没有提到你的 RDBMS,所以这里有一个MySQL 手册的解释。虽然自然连接是标准 SQL。
NATURAL 连接或 USING 连接的列可能与以前不同。具体来说,冗余的输出列不再出现,SELECT * 扩展的列顺序可能与以前不同。
考虑这组语句:
CREATE TABLE t1 (i INT, j INT);
CREATE TABLE t2 (k INT, j INT);
INSERT INTO t1 VALUES(1,1);
INSERT INTO t2 VALUES(1,1);
SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 JOIN t2 USING (j);
以前,这些语句会产生以下输出:
+------+------+------+------+
| i | j | k | j |
+------+------+------+------+
| 1 | 1 | 1 | 1 |
+------+------+------+------+
+------+------+------+------+
| i | j | k | j |
+------+------+------+------+
| 1 | 1 | 1 | 1 |
+------+------+------+------+
在第一个 SELECT 语句中,列 j 出现在两个表中,因此成为连接列,因此,根据标准 SQL,它应该在输出中只出现一次,而不是两次。同样,在第二个 SELECT 语句中,列 j 在 USING 子句中命名,并且应该在输出中只出现一次,而不是两次。但是在这两种情况下,冗余列都没有被消除。此外,根据标准 SQL,列的顺序不正确。
现在语句产生这个输出:
+------+------+------+
| j | i | k |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+
+------+------+------+
| j | i | k |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+
冗余列被剔除,按照标准 SQL 列顺序正确