按左联接的SQL顺序,包括不匹配项

时间:2018-11-26 10:57:22

标签: sql join

我有以下两个表。

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

我正在尝试根据表'Activity'中的相关活动将表'Tactic'中的ID排序。

我尝试遵循以下条件:

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

但是由于战术1没有活动,因此没有正确的顺序,因为我希望没有活动的战术被认为是最早的。

希望您能帮助我。

2 个答案:

答案 0 :(得分:1)

请考虑将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上,上述代码应按原样工作。

答案 1 :(得分:1)

标准SQL允许您指定NULLS LASTNULLS 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;