Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL按左联接排序,包括不匹配项_Sql_Join - Fatal编程技术网

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”类似于“
的情况会怎样?