PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Присъединете четири таблици, включващи LEFT JOIN без дубликати

Имате две LEFT JOINS :

  • Първото ляво присъединяване може да се присъедини към няколко реда от solved . Кажете, 'jane' и 'luke' са решили задачата.
  • Второто ляво присъединяване може да се присъедини само към потребители на име „luke“ („luke“ в условието за присъединяване!).

Все пак получаватеи двете редове, 'jane' просто не се показва, условието за присъединяване я филтрира, но LEFT JOIN все пак запазва реда в резултата и добавя NULL стойности.

Можете да постигнете това, което търсите, като използвате скоби и [INNER] JOIN вместо LEFT JOIN между solved и users . Ръководството:

Използвайте скоби, ако е необходимо, за да определите реда на влагане. При липса на скоби JOIN s гнездо отляво надясно.

SELECT c.name AS cat_name, t.name AS task_name, u.name AS user_name
FROM   task t
JOIN   category c ON cat.id = t.category_id
LEFT   JOIN
      (solved s JOIN users u ON u.id = s.user_id AND u.name = 'luke') ON s.task_id = t.id
ORDER  BY 1, 2, 3;
  • Използване на име на таблица users вместо запазената дума user .

  • Ако приемем, че users.name се дефинирауникален или можете да имате няколко потребители с име 'luke'.

  • Ако (task.id, users.id) в solved е дефиниран UNIQUE или PRIMARY KEY , нямате нужда от DISTINCT изобщо.

Получената заявка е не само правилна, но и по-бърза.

SqlAlchemy версия на горната заявка: (донесено от @van)
Това предполага, че Category , Task и User са картографирани класове, докато solved е екземпляр на Table (само асоциативна таблица, както е показано в примера с код Много към много):

user_name = 'luke'
q = (session.query(Category.name, Task.name, User.name)
     .select_from(Task)
     .join(Category)
     .outerjoin(
         join(solved, User,
              (solved.c.user_id == User.id) & (User.name == user_name),
         ))
     .order_by(Category.name, Task.name, User.name)
     )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Таблици и индекси спрямо HDD и SSD

  2. Как работят изгледите на PostgreSQL security_barrier?

  3. Инсталирайте и се свържете с PostgreSQL 10 на Ubuntu 16.04

  4. Унищожаване на Postgres DB на Heroku

  5. Комбинации от заявки с вложен масив от записи в тип данни JSON