0

这是我的困惑:

我需要根据主键连接两个表的所有列,但我不想在结果中重复主键。第二个表有主键,然后是未知的列数和名称。

所以本质上我想要

SELECT * (except for b.PK) FROM 
  TableA a
    JOIN TableB b ON a.PK = b.PK

显而易见的解决方案是从表 a 中显式选择除 a.PK 之外的所有列,但假设我也不知道表 a 中列的数量或名称(除非我知道它有 PK)。

所以总结一下:

如何通过它们的 PK 连接两个表,我不明确知道它们的其余列,并且在结果中不重复 PK?

编辑:(将 T-SQL 与 SQL Server 一起使用)

4

1 回答 1

2

类似的东西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 列顺序正确

于 2013-10-31T15:28:21.323 回答