2017-02-03 2 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“)», он не показывает никаких результатов.

table1:

KEY VALUE 
test '1','2' 

table2:

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

У меня есть идея! Не храните свои значения, как в таблице 1. Имейте одну запись для каждого значения. Конструкция по своей сути ошибочна. –

ответ

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

Смежные вопросы