1

现在我正在使用一个看起来像这样的 sql 查询。

SELECT 
'Name',
'Department' 
UNION ALL tb1.Name, 
tb2.Department FROM tb1 
LEFT OUTER JOIN tb2 ON 
tb1.MyIndex = tb2.MyIndex 
ORDER BY Name, Department ASC;

我遇到的困境是订购并没有真正按照我需要的方式工作。为了出口,我需要将标题留在查询的顶部,而且我的部门没有正确订购。我的输出看起来像这样。

David   |    1
Joe     |    1
Phil    |    3
George  |    2
Name    | Department

现在,当我取出标题时,我可以按列排序而不会发生意外

SELECT tb1.Name, tb2.Department
FROM tb1 LEFT OUTER JOIN tb2 ON
tb1.MyIndex = tb2.MyIndex
ORDER BY tb1.Name, tb2.Department

我的输出看起来不错。

David   |    1
Joe     |    1
George  |    2
Phil    |    3

除了一件事,这个查询以

INTO OUTFILE 'file.txt' FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '' LINES
TERMINATED BY '\n'

当我导入此文件时,我需要标题,但是当我将标题放入时,我必须搜索标题而不是列名,并且 ORDER BY 甚至无法正常工作,所以我的问题是如何订购结果为

ORDER BY tb1.Name, tb2.Department 

这样我的结果将看起来像我在这篇文章中的第二组结果,但包含标题?

4

2 回答 2

2

要正确执行此操作,您不应依赖联合输出的顺序。相反,要明确:

select name, department
from (SELECT 'Name' as name, 'Department' as department, 1 as isheader
      UNION ALL
      SELECT tb1.Name, tb2.Department, 0 as isheader
      FROM tb1 LEFT OUTER JOIN tb2
           ON tb1.MyIndex = tb2.MyIndex
     ) t
ORDER BY isheader desc, tb1.Name, tb2.Department+0

为了清楚起见,文档说:

但是,对单个 SELECT 语句使用 ORDER BY 并不意味着行在最终结果中出现的顺序,因为默认情况下 UNION 会产生一组无序的行。

于 2013-03-22T15:31:53.610 回答
1

您应该能够使用子查询来做到这一点:

SELECT 
  'Name' as header1,
  'Department' as header2 
UNION ALL 
select 
  suq_query.Name,
  suq_query.Department
from
(
  select tb1.Name, 
    tb2.Department 
  FROM tb1 LEFT OUTER JOIN tb2 ON tb1.MyIndex = tb2.MyIndex 
  ORDER BY Name ASC, Department ASC
) as suq_query
INTO OUTFILE 'file.txt' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '' LINES
TERMINATED BY '\n';
于 2013-03-22T15:26:25.677 回答