UNION ALL - ORDER BY,排序
Posted
技术标签:
【中文标题】UNION ALL - ORDER BY,排序【英文标题】:UNION ALL - ORDER BY, sorting 【发布时间】:2014-07-17 18:38:39 【问题描述】:我从 3 个表中获取记录:
(
SELECT
f.id AS id,
'Faktura VAT' as type,
DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue
FROM Invoice_vat f
)
UNION ALL
(
SELECT
f.id AS id,
'Faktura korygująca' as type,
DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue
FROM Invoice_fks f
)
UNION ALL
(
SELECT
f.id AS id,
'Faktura proforma' as type,
DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue
FROM Invoice_pro f
)
ORDER BY date_issue DESC
我尝试使用字段“date_issue”对所有内容进行排序,但这不起作用...有什么想法吗?
【问题讨论】:
【参考方案1】:它按“date_issue”排序。问题是它的格式很糟糕,一个月中的第一天是第一天。因此,该列表可能从 1 月 1 日开始,但 2 月 1 日在 1 月 2 日之前。我将使用规范格式 YYYY-MM-DD 来解决这个问题,这是日期的 ISO 标准格式。
您也可以通过在输出中包含原始列来轻松解决此问题:
(
SELECT
f.id AS id,
'Faktura VAT' as type,
DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue,
f.date_issue as orig_date_issue
FROM Invoice_vat f
)
UNION ALL
(
SELECT
f.id AS id,
'Faktura korygująca' as type,
DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue,
f.date_issue as orig_date_issue
FROM Invoice_fks f
)
UNION ALL
(
SELECT
f.id AS id,
'Faktura proforma' as type,
DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue,
f.date_issue as orig_date_issue
FROM Invoice_pro f
)
ORDER BY orig_date_issue DESC;
如果您实际上不想选择该字段,可以使用子查询。
【讨论】:
【参考方案2】:您是按date_issue
的修改版本排序的,所以它将作为字符串而不是日期排序。
尝试为最后的日期进行格式化,而不是为每个Union
:
Select ID,
Type,
DATE_FORMAT(date_issue, '%d.%m.%Y') As Date_Issue
From
(
(
SELECT
f.id AS id,
'Faktura VAT' as type,
f.date_issue
FROM Invoice_vat f
)
UNION ALL
(
SELECT
f.id AS id,
'Faktura korygująca' as type,
f.date_issue
FROM Invoice_fks f
)
UNION ALL
(
SELECT
f.id AS id,
'Faktura proforma' as type,
f.date_issue
FROM Invoice_pro f
)
) A
ORDER BY A.date_issue DESC
【讨论】:
以上是关于UNION ALL - ORDER BY,排序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序
UNION ALL和order by 的关系,group by 和字段的关系,以及MAX函数
ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束