2013-02-22 96 views
0

我正在使用的數據庫(但沒有設計)有一個奇怪的結構,其中一個表的行的主鍵(id)包含在另一個表的行的主鍵內。例如,如果table1有一個id爲'933'的行,table2將有一個帶有一個id的行,但前綴爲一個單詞,例如, 'something933'。當一個表的主鍵與另一個表的主鍵不同但包含在另一個表的主鍵中時如何連接表?

SELECT * FROM table1, table2 WHERE table1.id = table2.id 

這就是基本的查詢,但由於table1.id的內容就像是「933」和table2.id就像「something933」,我需要的東西等,其中table1.id = table2.something + ID。

有什麼辦法可以在單個查詢中連接這些表嗎?

回答

2

是的,你可以做到這一點,但是這是一個非常糟糕的設計。此外,您的查詢格式不正確,因爲您應該真正指定連接條件,而不是使用WHERE子句。按照您所做的方式進行操作,無需指定連接條件,即可爲您提供表格的笛卡爾積,然後過濾出您的條件。所以,你可以使用這樣的:

SELECT * FROM table1 
INNER JOIN table2 ON CONCAT('something', table1.id) = table2.id 

當然,你會失去使用表1上的指數爲加入的能力(因此不好的設計部分)。

如果可以的話,我只需更新table2上的那些id以刪除前綴。

+0

是啊,我想我會走另一條路,如果可以的話,從table2.id中除去「某些東西」。可能也可能有一個計算的指標。當我傷害到對我做過這些事情的人之後,那個過程...... – 2013-02-22 22:53:35

+0

太棒了,邁克,謝謝。至少,這將是一個很好的臨時解決方案;稍後或許我會看看改變設計的麻煩是否值得,但這只是我接手的一個小項目。 – redburn 2013-02-22 23:13:28

0

我相信你想使用的,如Word:

SELECT * FROM table1, table2 WHERE table2.id LIKE CONCAT('%', table1.id, '%'); 

這裏有一個類似的問題和答案:

How to use an user variables in MySQL LIKE clause?

+1

這有一個'額外'匹配的嚴重缺點。考慮'table1.id = 933'和'table2.id ='something3933''的情況。 – spencer7593 2013-02-22 22:51:34

+0

好點。如果前面的文本總是相同的,我只需要使用CONCAT,而不用像LIKE一樣。 – LNendza 2013-02-22 22:56:34

0
SELECT * FROM table1, table2 WHERE table2.id LIKE '%'+table1.id 
相關問題