如何解决如何按情况写出正确的顺序
我有这个问题,如果我正常使用 sql
语句,我的意思是这样的:
SELECT p.id_plecari,p.id_aeroport,p.id_clasa,p.id_avion,p.data,p.ora,c.pret,av.nume,a.Nume,a.Locatie
from plecari p,clasa c,avioane av,aeroport a
where
p.id_aeroport = a.id_aeroport
AND p.id_clasa = c.id_clasa
AND p.id_avion = av.id_avion
AND p.id_plecari not in(SELECT r.id_plecare from rezervari r WHERE r.id_client = idClient)
ORDER BY p.id_clasa ASC;
一切都如我所愿,完美如this picture
但是在我添加 CASE
语句的那一刻,一切都搞砸了:
BEGIN
SELECT p.id_plecari,aeroport a
where
p.id_aeroport = a.id_aeroport
AND p.id_clasa = c.id_clasa
AND p.id_avion = av.id_avion
AND p.id_plecari not in(SELECT r.id_plecare from rezervari r WHERE r.id_client = idClient) ORDER BY
(CASE
WHEN (orderby = 1 AND orderas = false) THEN p.id_plecari
WHEN (orderby = 2 AND orderas = false) THEN av.nume
END) ASC,(CASE
WHEN (orderby = 1 AND orderas = true) THEN p.id_plecari
WHEN (orderby = 2 AND orderas = true) THEN av.nume
END) DESC;
END
一切看起来都like this!
解决方法
SELECT
p.id_plecari,p.id_aeroport,p.id_clasa,p.id_avion,p.data,p.ora,c.pret,av.nume,a.Nume,a.Locatie
FROM
plecari p
INNER JOIN
clasa c
ON p.id_clasa = c.id_clasa
INNER JOIN
avioane av
ON p.id_avion = av.id_avion
INNER JOIN
aeroport a
ON p.id_aeroport = a.id_aeroport
WHERE
p.id_plecari not in (
SELECT r.id_plecare from rezervari r WHERE r.id_client = idClient
)
ORDER BY
CASE WHEN (orderby = 1 AND orderas = false) THEN p.id_plecari END,CASE WHEN (orderby = 2 AND orderas = false) THEN av.nume END,CASE WHEN (orderby = 1 AND orderas = true ) THEN p.id_plecari END DESC,CASE WHEN (orderby = 2 AND orderas = true ) THEN av.nume END DESC;
这显示了如何使用 JOIN
,以及如何将您的 ORDER BY
分解成多个部分。
但是请注意,这种“条件排序”样式的性能可能非常差。
这是因为数据库必须生成一个单一的执行计划来满足所有可能性。
更高性能的方法是将主查询作为视图,然后使用类似于...的东西
IF (orderby = 1 AND orderas = false) THEN
SELECT * FROM yourView ORDER BY p.id_plecari;
ELSEIF (orderby = 2 AND orderas = false) THEN
SELECT * FROM yourView ORDER BY av.nume;
ELSEIF (orderby = 1 AND orderas = true) THEN
SELECT * FROM yourView ORDER BY p.id_plecari DESC;
ELSEIF (orderby = 2 AND orderas = true) THEN
SELECT * FROM yourView ORDER BY av.nume DESC;
ENDIF;
这允许每个排序模式有不同的执行计划。
- This 更详细地解释了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。