2017-02-03 75 views
1

我想执行内部联接桌子上,基于它的值,如:SQL JOIN表2 ON table2.value在(table1.value)

SELECT table2.value FROM table1 
INNER JOIN table2 ON table2.key IN (table1.value) 
WHERE table1.key = 'test' 

东西用在()不是工作时, “在(table1.value)” 不被解释为 “中( '1', '2')”,它不显示出任何效果。

表1:

KEY VALUE 
test '1','2' 

表2:

KEY VALUE 
1  result1 
2  result2 
3  result3 

我知道有这样的解决办法,但我想解决这个问题而无需额外的SELECT ...

SELECT * FROM table2 WHERE table2.value in (SELECT value FROM table1 WHERE key = 'test') 

任何想法? 谢谢, Lennart

+0

你必须使用一个子查询 – Hemal

+2

我有一个想法!不要在table1中存储你的值。每个值都有一个记录。这个设计本质上是有缺陷的。 –

回答

4

首先,你的数据结构是完全错误的。您不应该将字符串列表存储在一个字符串中。有很多很好的理由:

  • SQL没有很好的字符串处理函数。
  • 您不应该将整数存储为字符串。
  • 你应该声明正确的外键关系。
  • 您的查询无法利用索引或分区。

对于每个键和每个值,正确的解决方案是一行。

但是,有时候,我们被其他人的设计决定搞得很糟糕。在这种情况下,你可以使用like

SELECT table2.value 
FROM table1 t1 INNER JOIN 
    table2 t2 
    ON t1.value LIKE '%''' + t2.key + '''%' 
WHERE t1.key = 'test'; 
+0

谢谢!不知道LIKE能够解决它。 – lka42

相关问题