#mysql
Вопрос:
Как я могу это заменить?..
where fieldId in ( select fieldId from setting where settingId = joinedTable.settingId )
с этим…
where fieldId in ( select id from field )
когда первый where in
ничего не возвращает?
case
не будет работать, потому что он возвращает несколько строк… В этом и заключается идея.
where fieldId in ( case when (select count(id) from setting where settingId = joinedTable.settingId) gt; 0 then (select fieldId from setting where settingId = joinedTable.settingId) else (select id from field) end )
Ответ №1:
Что-то вроде:
select distinct coalesce(setting.fieldId,field.id) from field left join setting on setting_id = joinedTable.settingId
Если в настройках нет совпадающих строк, для каждой строки в поле будет создана одна строка. левые соединения, в которых объединенная таблица не найдена, приводят к нулю для всех столбцов, поэтому объединение вернет каждый field.id.
Если в настройках есть совпадающие строки, это приведет к декартову произведению двух таблиц со всеми возможными комбинациями настроек.fieldId и field.id. Я предполагаю, что fieldId никогда не будет равен нулю, поэтому объединение вернет его, а не field.id, и дубликаты (по одному для каждой строки в поле) будут удалены отдельным.
Комментарии:
1. ОК… Что это было за колдовство???
2. добавлено объяснение; пожалуйста, скажите что-нибудь, если что-то из этого не имело смысла