Динамически изменяться при условии внутреннего объединения SQL - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно написать SQL-запрос для следующего сценария.если b.field1 = 123, то в моем запросе должно быть условие ON для внутреннего соединения, подобное этому.

select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on (a.field1 = b.field1 or a.field1='abc' or  field1='def')
where b.field1 = 123 and a.field2 = 'W'.

, если значение b.field1 отличается от 123, то в моем запросе должно быть условие ON для diff внутреннего соединения.

select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on (a.field1 = b.field1)
where b.field1 = 234 and a.field2 = 'W'.

Основываясь на b.field1, мне нужно иметь другое условие ON для внутреннего соединения.Я не хочу писать 2 запроса.Я пытался использовать case, но мне было трудно реализовать его, получая синтаксические ошибки.Может ли кто-нибудь с опытом работы с SQL посоветовать мне, как мне написать это в 1 запросе.

Я пробовал что-то подобное, но у меня есть 2 проблемы, IN не допускается при использовании case, а также в THEN & ELSEчасть CASE, позволяет мне использовать любое из выбранных полей ( a.field1, a.field2, a.field3, b.field1, b.field2, b.field3 ).

select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on a.field1 in 
case when b.field1 <> 123
then 
 (b.field1)
else
 (b.field1, 'abc', 'def')
end
where b.field1 = 123 and a.field2 = 'W'.

Я публикую ответ, так как он может кому-нибудь помочь.

select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on ((b.field1 <> 123 and a.field1=b.field1) 
or (b.field1=123 and a.field1 in (b.field1, 'abc', 'def')))
where b.field1 = 123 and a.field2 = 'W'.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Как правило, вы можете переписать любую условную логику if / conditional с осторожным использованием AND, хотя производительность в процессе может пострадать.

ON (b.field1 = 123 AND (first conditions))
OR (b.field1 <> 123 AND (second conditions))

Как сказано выше, производительность может снизиться (MySQLпроизводительность, в частности использование индекса, относительно низкая, если задействовано ИЛИ);поэтому альтернативой является использование UNION (который по-прежнему представляет собой один запрос, даже если он более подробный и полубрезервированный):

select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on (a.field1 = b.field1 or a.field1='abc' or a.field1='def')
where b.field1 = 123 and a.field2 = 'W'
UNION ALL
select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on (a.field1 = b.field1)
where b.field1 = 234 and a.field2 = 'W'.
0 голосов
/ 27 февраля 2019

Вам просто нужно добавить вторую часть первого условия JOIN (or a.field1='abc' or a.field1='def') к первой части (a.field1 = b.field1), обусловленного b.field1 = 123 т.е.

inner join b on (a.field1 = b.field1 or b.field1 = 123 and (a.field1='abc' or a.field1='def'))
...