使用 Union 优化 SQL Select
Optimization for SQL Select with Union
我有以下 SQL 查询,我在其中使用了 UNION:
SELECT notification FROM NotificationDb notification WHERE notification.proc_name = 'a' AND notification.status = 1 AND notification.module = 1
UNION
SELECT notification FROM NotificationDb notification WHERE notification.proc_name = 'b' AND notification.param1 >0 AND notification.status = 1 AND notification.module = 1
UNION
SELECT notification FROM NotificationDb notification WHERE notification.proc_name = 'b' AND notification.param1 <= 0 AND notification.status = 1 AND notification.module = 1
我是这样设置的,因为我需要它们按 proc_name 字段排序,还需要在 proc_name 为 'b'
的情况下按 param1 值排序
问题:是否有更好、更有效的方法来组合一个查询return相同的结果?
如有任何帮助,我们将不胜感激!
如果我没理解错的话,你在这里不需要联合,你可以只做一个不同的 select:
SELECT DISTINCT notification
FROM NotificationDb
WHERE status = 1 AND module = 1 AND proc_name IN ('a', 'b')
ORDER BY
proc_name,
param1 DESC;
在这里,我们添加一个 ORDER BY
子句,将 a
proc_name
条记录放在 b
之前。然后,在所有 b
条记录中,我们首先显示较大的 param1
条记录。这种排序保持了你在当前联合查询中的感知顺序(尽管应该注意没有这样的实际顺序; always 如果你期望一个特定的 ORDER BY
子句在结果集中排序)。
我有以下 SQL 查询,我在其中使用了 UNION:
SELECT notification FROM NotificationDb notification WHERE notification.proc_name = 'a' AND notification.status = 1 AND notification.module = 1
UNION
SELECT notification FROM NotificationDb notification WHERE notification.proc_name = 'b' AND notification.param1 >0 AND notification.status = 1 AND notification.module = 1
UNION
SELECT notification FROM NotificationDb notification WHERE notification.proc_name = 'b' AND notification.param1 <= 0 AND notification.status = 1 AND notification.module = 1
我是这样设置的,因为我需要它们按 proc_name 字段排序,还需要在 proc_name 为 'b'
的情况下按 param1 值排序问题:是否有更好、更有效的方法来组合一个查询return相同的结果?
如有任何帮助,我们将不胜感激!
如果我没理解错的话,你在这里不需要联合,你可以只做一个不同的 select:
SELECT DISTINCT notification
FROM NotificationDb
WHERE status = 1 AND module = 1 AND proc_name IN ('a', 'b')
ORDER BY
proc_name,
param1 DESC;
在这里,我们添加一个 ORDER BY
子句,将 a
proc_name
条记录放在 b
之前。然后,在所有 b
条记录中,我们首先显示较大的 param1
条记录。这种排序保持了你在当前联合查询中的感知顺序(尽管应该注意没有这样的实际顺序; always 如果你期望一个特定的 ORDER BY
子句在结果集中排序)。