многоуровневый каскадный запрос выбора внутреннего соединения

#sql #database #postgresql

#sql #База данных #postgresql

Вопрос:

У меня следующая структура таблицы введите описание изображения здесь

Я хотел бы выбрать post_id из любых доступных данных short_name (название страны), name (таблица состояний) или region_name. Выполнение следующего запроса дает истинный результат для region_name, но не для short_name (название страны), name (таблица состояний).

 select *
from t_post_city
inner join t_region on t_region.region_id = t_post_city.city_id
inner join t_country on t_region.country_id = t_country.country_id
inner join t_states on t_region.province_id = t_states.state_id
where t_country.short_name like %india%
   or t_states.name like %rajasthan%
   or t_region.region_name like %sitapura%
 

Скажите мне, пожалуйста, где я ошибаюсь!

Комментарии:

1. Вы используете MySQL или Postgresql? (Не помечайте продукты, которые не задействованы.)

2. извините, мой запрос si select * from t_post_city внутреннее соединение t_region с t_region.region_id = t_post_city.city_id внутреннее соединение t_country с t_region.country_id = t_country.country_id внутреннее соединение t_states с t_region. province_id = t_states.state_id где t_country.short_name, например %india% или t_states. имя, например %rajasthan% или t_region.region_name, например %sitapura%

3. На самом деле это postgres

Ответ №1:

 select *
from t_post_city
LEFT OUTER join t_region on t_region.region_id = t_post_city.city_id
LEFT OUTER join t_country on t_region.country_id = t_country.country_id
LEFT OUTER join t_states on t_region.province_id = t_states.state_id
 where t_country.short_name like '%india%'
 or t_states.name like '%rajasthan%'
 or t_region.region_name like '%sitapura%'
 

Ответ №2:

Используйте отдельное табличное выражение для каждого из трех ваших критериев. Напишите свою OR логику, используя UNION в SQL:

 select post_id
from t_post_city
inner join t_region on t_region.region_id = t_post_city.city_id
where t_country.short_name like %india%
t_region.region_name like %sitapura%
union
select post_id
from t_post_city
inner join t_region on t_region.region_id = t_post_city.city_id
inner join t_country on t_region.country_id = t_country.country_id
where t_country.short_name like %india%
union
select post_id
from t_post_city
inner join t_region on t_region.region_id = t_post_city.city_id
inner join t_states on t_region.province_id = t_states.state_id
where t_states.name like %rajasthan%;