Порядок SQL по левому соединению, включая несовпадения - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующие две таблицы.

Table: Tactic
id name
1  Tactic 1
2  Tactic 2
3  Tactic 3

Table: Activity
id Tactic_id  Date
1  2          2018-01-01
2  3          2018-01-02

Я пытаюсь, чтобы идентификаторы в таблице 'Tactic' были упорядочены по их связанным действиям из таблицы 'Activity'.

Я попытался сделать следующее:

SELECT * FROM Tactic
LEFT JOIN Activity ON Tactic.id = Activity.Tactic_id
ORDER BY Activity.Date DESC

Но поскольку в Tactic 1 нет активности, она не упорядочена правильным образом, так как я хочу, чтобы Tactics без активности считалась самой старой.

Надеюсь, вы сможете мне помочь.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Стандартный SQL позволяет указать NULLS LAST или NULLS FIRST:

SELECT t.*, a.*
FROM Tactic t LEFT JOIN
     Activity a
     ON t.id = a.Tactic_id
ORDER BY a.Date DESC NULLS LAST;

Если база данных не поддерживает это, вы можете использовать два ключа в ORDER BY:

SELECT t.*, a.*
FROM Tactic t LEFT JOIN
     Activity a
     ON t.id = a.Tactic_id
ORDER BY (CASE WHEN a.DATE IS NULL THEN 1 ELSE 2 END) DESC,  -- NULLs last
         a.Date DESC;
0 голосов
/ 26 ноября 2018

Попробуйте заменить NULL даты из таблицы Activity на какой-то очень ранний литерал даты, например, 1900-01-01:

SELECT *
FROM Tactic t
LEFT JOIN Activity a
    ON t.id = a.Tactic_id
ORDER BY
    COALESCE(a.Date, '1900-01-01') DESC;

Формат литерала даты может зависеть от базы данных.Например, в Oracle нам придется использовать что-то вроде DATE '1900-01-01', в то время как в MySQL, Postgres или SQL Server приведенный выше код должен работать как есть.

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