Как выбрать следующие данные в одном запросе - PullRequest
0 голосов
/ 30 мая 2018

Я использую postgres

Таблица 1: человек

Columns:: id,person_name,person_add,block_id
FK==>person(block_id) reference block(id)

Таблица 2: блок

Columns:: id,block_name,district_id
FK==> block(district_id) reference district(id)

Таблица 3: район

Columns:: id,district_name,state_id
FK==> district(state_id) reference state(id)

Таблица 4: состояние

Columns:: id,state_name,country_id
FK==> state(country_id) reference country(id)

Таблица 5: страна

Columns:: id,country_name

Я написал запрос следующим образом: *

Когда мне нужны подробности блока

SELECT p.id,p.person_name,b.block_name,d.district_name,s.state_name,c.country_name
FROM person p 
INNER JOIN block b ON b.id = p.block_id
INNER JOIN district d ON d.id = b.district_id
INNER JOIN state s ON s.id = d.state_id
INNER JOIN country c ON c.id = s.country_id
WHERE b.id = ? OR d.id = ? OR s.id = ? OR c.id = ?

как написать его в одном запросев следующих случаях ???

1.i имеют только идентификатор страны, и s.id, d.id, b.id будут нулевыми (здесь приведенный выше запрос дает прекрасный результат)

2. у меня есть идентификатор страны, идентификатор штата и d.id, b.id (здесь предпочтительнее c.id)

3.i есть идентификатор страны, идентификатор штата и идентификатор района b.id (то же самое здесь, в соответствии с c.id)

4.i имеет идентификатор страны, идентификатор штата, идентификатор района и идентификатор блока, равный NULL (то же самое здесь он будет предпочитать в соответствии с c.id)

1 Ответ

0 голосов
/ 30 мая 2018

Если я правильно понимаю, критерии необязательны.Вы можете искать определенную страну, штат, район и квартал или, например, только страну.

Поэтому проверьте каждую переменную на ноль.Примерно так:

SELECT p.id,p.person_name,b.block_name,d.district_name,s.state_name,c.country_name
FROM person p 
INNER JOIN block b    ON b.id = p.block_id
INNER JOIN district d ON d.id = b.district_id
INNER JOIN state s    ON s.id = d.state_id 
INNER JOIN country c  ON c.id = s.country_id
WHERE (b.id = :block_id    OR :block_id is null)
  AND (d.id = :district_id OR :district_id is null)
  AND (s.id = :state_id    OR :state_id is null)
  AND (c.id = :country_id  OR :country_id is null);

(Вы также можете переместить условия в пункты ON, в зависимости от того, что вы предпочитаете.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...