我有一个问题需要解决。 我有一个职业表姓名和职业。
我的任务是: 1.在“职业”中查询按字母顺序排列的所有姓名的名单,紧接着是每个职业的第一个字母作为括号(即括在括号中)。例如:AnActorName(A),ADoctorName(D),AProfessorName(P)和ASingerName(S)。
共有[occup_count] [职业] s。
如果多个职业具有相同的职业,则应按字母顺序排列。
我差不多完成了查询
SELECT TEMP.CON1
FROM (
SELECT NAME, CONCAT(NAME,'(', LEFT(OCCUPATION, 1),')') AS CON1
FROM OCCUPATIONS
ORDER BY NAME
) AS TEMP
UNION
SELECT TEMP2.CON2
FROM (
SELECT COUNT(*) AS NR, CONCAT('THERE ARE A TOTAL OF ', COUNT(OCCUPATION),' ', OCCUPATION, 's') AS CON2
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY NR, OCCUPATION
) AS TEMP2
但我不知道如何在两个部分合并之后保持第一部分的顺序。
如果有人知道答案,我会很高兴分享。
答案 0 :(得分:1)
.m
答案 1 :(得分:-1)
UNION ALL
会保留顺序,并且在这种情况下也可以正常工作,因为结果集完全不同。
union和union all之间的区别在于UNION
删除重复项,这会导致重新排序,其中UNION ALL
只是将下一组结果添加到现有结果集的末尾。由于您在两个选择上操作字符串,因此TEMP和TEMP2之间的结果中不存在重复的可能性。这也将消除查询的一些成本,因为UNION
比UNION ALL
更昂贵,因为它需要检查重复项。
SELECT TEMP.CON1
FROM (
SELECT NAME, CONCAT(NAME,'(', LEFT(OCCUPATION, 1),')') AS CON1
FROM OCCUPATIONS
ORDER BY NAME
) AS TEMP
UNION ALL
SELECT TEMP2.CON2
FROM (
SELECT COUNT(*) AS NR, CONCAT('THERE ARE A TOTAL OF ', COUNT(OCCUPATION),' ', OCCUPATION, 's') AS CON2
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY NR, OCCUPATION
) AS TEMP2
这就是说,我读取指令的方式,我不希望在同一结果集中需要两个结果。