我有以下两个表。
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没有活动,因此没有正确的顺序,因为我希望没有活动的战术被认为是最早的。
希望您能帮助我。
答案 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 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;