SQL按左联接排序,包括不匹配项
我有以下两张桌子SQL按左联接排序,包括不匹配项,sql,join,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 我正在尝试将表“策略”中的id按其相关活动从表“活动”中排序 我已尝试以下方法: SELECT * FROM Tactic LEFT JOIN Activity ON Tactic.id =
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
我正在尝试将表“策略”中的id按其相关活动从表“活动”中排序
我已尝试以下方法:
SELECT * FROM Tactic
LEFT JOIN Activity ON Tactic.id = Activity.Tactic_id
ORDER BY Activity.Date DESC
但是由于战术1没有活动,它的顺序不正确,因为我希望没有活动的战术被认为是最古老的
希望您能帮助我。考虑将
活动
表中的NULL
日期替换为一些非常早的日期文字,例如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上,我们必须使用类似于日期'1900-01-01',而在MySQL、Postgres或SQL Server上,上述代码应按原样工作。考虑将
活动
表中的NULL
日期替换为一些非常早的日期文字,例如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上,我们必须使用类似于日期“1900-01-01”的
代码,而在MySQL、Postgres或SQL Server上,上述代码应按原样工作。标准SQL允许您指定最后一个空值
或第一个空值
:
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;
标准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;
在Postgres或Oracle上,我们不必使用类似日期“1900-01-01”的东西
——我们会使用空值LAST
。@没有名字的马最后空值?反对空值的东西在Postgres或Oracle中,我们不必使用类似日期“1900-01-01”的东西——我们会使用空值LAST
。@没有名字的马最后空值?反对空值的东西你用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品postgresql
,oracle
,sql server
,db2
,…如果Activity.Date为空,则其他Activity.Date END,您使用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加一个“postgresql
,oracle
,sql服务器
,db2
,…如果Activitiy.Date为空,则其他Activity.Date END”类似于“的情况会怎样?