SELECT service.*
FROM star_service
INNER JOIN service ON service.code = star_service.service
UNION
SELECT service.*
FROM service
如何修改上述查询,以便首先显示第一个表的结果,然后显示联合中的第二个查询?
答案 0 :(得分:6)
在结果集中添加一个附加列,然后使用该列进行排序。
像这样:
SELECT service.*, 1 as OBCol
FROM star_service
INNER JOIN service ON service.code = star_service.service
UNION
SELECT service.*, 2 as OBCol
FROM service
ORDER BY OBCol
答案 1 :(得分:2)
我会完全跳过union
。如果您希望service
中的所有内容与star_service
中的所有内容一起使用,那么只需使用left join
和order by
:
select s.*
from service s left join
star_service ss
on s.code = ss.service
order by (ss.service is not null) desc;
编辑:
如果star_service
中有重复项,那么最好使用exists
:
select s.*, (exists (select 1 from start_service ss where s.code = ss.service) ) as in_ss
from service s
order by (is_ss is not null) desc;
这些版本(带有正确的索引)应该比原始版本或union
的任何版本都要好得多。
答案 2 :(得分:0)
使用UNION ALL
,它会按照编码顺序保留两个查询结果的选定顺序(并保留重复项)。
只需添加ALL
:
SELECT service.*
FROM star_service
INNER JOIN service ON service.code = star_service.service
UNION ALL
SELECT service.*
FROM service
答案 3 :(得分:0)
最好使用UNION ALL代替UNION,因为
union给出了排序输出。
union all提供未排序的输出
SELECT service.*
FROM star_service
INNER JOIN service ON service.code = star_service.service
UNION ALL
SELECT service.*
FROM service