2012-03-30 18 views
3

我要加入兩個表與數百列,就像這樣:SQL - 加入而非複製鍵

select * from a, b where a.key = b.key 

的問題是,我得到了

Key | Key | Row1 | etc... 

沒有命名錶所有列明確(「select a.key, row1, ... from a, b where a.key = b.key」),有沒有辦法限制查詢,以便它只返回一個鍵?

+4

不,你需要指定你想要的列,如果你只需要'b'的數據,那麼你就可以做'a.key,b。*' – 2012-03-30 14:07:21

+0

@rs。啊,那照顧它。 Hiro2k的答案似乎與你的第一句話相矛盾;然而,你的解決方案似乎是我的目的最好的解決方案。謝謝! – canisrufus 2012-03-30 14:24:26

回答

6
select * from a INNER JOIN b USING (key) 

using語句導致關鍵只在您的結果一旦顯示出來。

+0

謝謝,這似乎解決了我問的問題。我有其他問題,我的密鑰不匹配:我必須採取其中一個鍵的子字符串。是否有語法允許子字符串(key1)= key2? – canisrufus 2012-03-30 14:19:04

+0

這是設計不好的標誌。表格中的按鍵應該100%匹配。如果你想這樣做,你可以但不使用USING子句。你將不得不改變使用ON子句,但是重複出現。 – Hiro2k 2012-03-30 14:32:07

+1

@ Hiro2k這是數據庫圈中非常強烈的爭用問題。就我個人而言,我認爲'USING'作爲連接條件是一個可怕的錯誤,導致脆弱的SQL。真正的解決方法是不要在生產代碼中使用'SELECT *' - 明確列出列,始終如此,沒有失敗。這可以防止列被添加/重新排序,並幫助大多數DB中的解析器也提供更多有用的錯誤消息。 – 2012-03-30 14:50:40

3

也許NATURAL JOIN是爲您解決:

SELECT * FROM a NATURAL JOIN b; 

但如果有更多的重複鍵名稱和需要這兩種密鑰的結果,則自然連接是對你不好。

+3

+1教我新的東西。根據維基百科:「大多數專家都認爲NATURAL JOINs是危險的,因此強烈阻止它們的使用。」可能要去用「使用」語句。 – canisrufus 2012-03-30 14:15:31

+0

起初我誤解了這個問題。我以爲你想刪除所有重複的關鍵名稱。我同意,自然連接是危險的,不應該使用。 – 2012-03-30 14:17:37

1

如果您專門爲您的字段命名而不是*,則不會有重複鍵,並且查詢速度會更快(所以我聽說過)。

select key, field1, field2, field3 from a, b where a.key = b.key 
+0

事實上,它是幾百列使得那種不吸引人.. – canisrufus 2012-03-30 14:14:48

+0

它不應該使任何理智的數據庫,我知道的查詢更快,除非你實際上只想要一小部分的列。即使這樣,只有在省略的列非常大時(即:減少將數據傳輸到客戶端的成本),或者使用像PostgreSQL的「TOAST」這樣的機制從主元組外存儲,它纔會有幫助。大列的抓取可以完全跳過。 – 2012-03-30 14:52:42

+2

@canisrufus「數百列」可能是您的問題的一部分;-)但我明白,乾淨漂亮的設計並不總是滿足現實世界的性能需求。根據情況你可能需要考慮一個鍵/值擴展類型,比如PostgreSQL的'hstore',甚至是* shudder * EAV設計。使用'SELECT *'時,你首先需要添加一列或者更糟 - 在中間的某個地方插入一個,你會傾向於討厭自己。 – 2012-03-30 14:55:14