2013-10-31 42 views
0

這裏聯接的列是我的困惑:加入未知的行數表,而不用重複由

我需要加入基於主鍵的兩個表中的所有列,但我不想再重複一次鍵入結果。 第二個表具有主鍵,然後是未知數和列的名稱。

所以基本上我想

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

明顯的解決辦法是從表中明確選擇所有列,除了a.PK,但讓我們說,我不知道電話號碼或列的名稱表一個要麼(除了我知道它有PK)。

所以總結:

如何通過他們的PK,在這裏我不知道他們的列的其餘部分明確地連接兩個表,並沒有在結果重複PK?

編輯:(使用T-SQL與SQL Server)

+0

什麼SQL產品,這是列的順序是正確的 ? – RBarryYoung

+0

SQL Server - 使用T-SQL ...對不起,沒有指定 –

回答

2

SELECT * except column foo FROM ...東西不存在。但是您可以使用自然連接,這樣可以消除多餘的列。你還沒有提到你的RDBMS,所以這是一個explanation from the MySQL manual。然而,自然連接是標準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

+0

有趣 - 我從來不知道自然連接......不幸的是,似乎SQL Server [不支持自然連接](http://database.blogs.webucator.com/2010/03/31/why -sql-server-doesnt-support-natural-join-syntax /),但認爲INNER連接是一樣的東西......在我的情況下是不正確的,因爲內部連接不會消除重複的列 –