0

ここに私の困惑があります:

主キーに基づいて 2 つのテーブルのすべての列を結合する必要がありますが、結果で主キーを繰り返したくありません。2 番目のテーブルには主キーがあり、列の数と名前が不明です。

だから本質的に私は欲しい

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

明らかな解決策は、a.PK を除くテーブル a からすべての列を明示的に選択することですが、テーブル a の列の数または名前もわからないとしましょう (ただし、PK があることはわかっています)。

要約すると:

2 つのテーブルを PK で結合するにはどうすればよいですか? 残りの列が明示的にわからない場合に、結果で PK を繰り返さずに結合するにはどうすればよいですか?

編集: (SQL Server で T-SQL を使用)

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 によれば、出力に 2 回ではなく 1 回だけ表示されます。同様に、2 番目の SELECT ステートメントでは、列 j が USING 句で指定されており、出力に 2 回ではなく 1 回だけ表示されます。ただし、どちらの場合も、冗長な列は削除されません。また、列の順序は標準 SQL に従って正しくありません。

これで、ステートメントは次の出力を生成します。

+------+------+------+
| j    | i    | k    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+
+------+------+------+
| j    | i    | k    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+

冗長な列が削除され、列の順序が標準 SQL に従って正しい

于 2013-10-31T15:28:21.323 に答える