ГДЕ В ответ все строки из другого запроса, когда РЕГИСТР равен false

#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. добавлено объяснение; пожалуйста, скажите что-нибудь, если что-то из этого не имело смысла