Использование Distinct или Case для уменьшения результатов в запросе - PullRequest
1 голос
/ 17 апреля 2019

Сценарий, представляющий собой простую базу данных о теннисе:

  • Выберите игроков мужского пола, которые имеют по крайней мере два «е» в своем имени. (Это часть отлично)

  • Показать список тех, кто в настоящее время имеет functie (роль) в члены правления стола (названный bestuursleden). Я вывел это когда столбец eind_datum (дата окончания) равен NULL для логического причины, как в моем запросе.

  • Игроки мужского пола в настоящее время без a functie (функция) также должны быть показано. Эта часть, где проблема.

Ожидаемый Результат:

naam (name)  | geslacht (gender)|   functie (role)
_____________|__________________|_______________
Permentier   | M                | Voorzitter
Bakker, de   | M                | NULL
Bohemen, van | M                | NULL
Meuleman     | M                | Penningmeester
Permentier   | M                | NULL

Мой Результат (мне не хватает имени Богемен, фургон ):

naam (name)  | geslacht (gender)|   functie (role)
_____________|__________________|_______________
Permentier   | M                | Voorzitter
Bakker, de   | M                | NULL
Meuleman     | M                | Penningmeester
Permentier   | M                | NULL

Мой запрос:

SELECT naam AS role, geslacht AS gender, functie AS role
FROM spelers s LEFT JOIN bestuursleden b ON s.spelersnr = b.spelersnr
WHERE geslacht LIKE 'M' AND LOWER(naam) LIKE '%e%e%' AND eind_datum IS NULL
ORDER BY s.spelersnr

Если я опускаю WHERE проверку AND eind_datum IS NULL, я получаю следующий результат, обратите внимание, что я добавил два столбца для дополнительной информации (дата начала и дата окончания), чтобы определить, могу ли я использовать CASE или, возможно, специальная функция DISTINCT , помогающая мне сохранить запись Bohemen, van , которая отсутствует в моем текущем результате запроса:

naam (name)  | geslacht (gender)|   functie (role)| begin_date | end_date
_____________|__________________|_________________|____________|___________
Permentier   | M                | Secretaris      |  NOT NULL  | NOT NULL
Permentier   | M                | Lid             |  NOT NULL  | NOT NULL
Permentier   | M                | Penningmeester  |  NOT NULL  | NOT NULL
Permentier   | M                | Voorzitter      |  NOT NULL  | NULL
Bakker, de   | M                | NULL            |  NULL      | NULL
Bohemen, van | M                | Secretaris      |  NOT NULL  | NOT NULL    
Meuleman     | M                | Penningmeester  |  NOT NULL  | NULL
Permentier   | M                | NULL            |  NULL      | NULL

Его Postgres, используя pgadmin в качестве инструмента.

Определения моей таблицы:

enter image description here

enter image description here

1 Ответ

3 голосов
/ 17 апреля 2019

Итак, насколько я понимаю, вы хотите отобразить игроков и их текущую роль, если они занимают один. Тогда лучше включить ваше условие end_date в оператор соединения, например:

SELECT s.naam AS role
     , s.geslacht AS gender
     , b.functie AS role
  FROM spelers s 
  LEFT 
  JOIN bestuursleden b 
    ON s.spelersnr = b.spelersnr
   AND b.eind_datum IS NULL
 WHERE s.geslacht = 'M' 
   AND LOWER(s.naam) LIKE '%e%e%'
 ORDER BY s.spelersnr

Это объединит только строки bestuursleden, которые имеют дату окончания NULL, то есть самую последнюю. Если у игрока установлена ​​дата окончания, он не будет присоединен, поэтому вы получите NULLs в полях из bestuursleden.

Примечание: ВСЕГДА использовать псевдонимы таблиц при обращении к именам столбцов в запросах, которые имеют соединение. В противном случае люди, которые не знакомы с вашей базой данных, не будут знать, откуда берется данный столбец.

...