1

(您可以在这里阅读更好地理解)

我想知道是否可以优化此查询:

SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p1 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p2 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p3 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p4 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p5 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p6 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p7 AND id_action_set = 1
UNION ALL
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p8 AND id_action_set = 1
4

2 回答 2

6

尝试:

SELECT id_type, value 
FROM Action, Action_set 
WHERE id_action IN (id_action_p1,id_action_p2,id_action_p3,id_action_p4,id_action_p5,id_action_p6,id_action_p7,id_action_p8) 
AND id_action_set = 1

如果有不止一行,请尝试:

SELECT id_type, value 
FROM Action, Action_set 
WHERE (id_action = id_action_p1
     OR id_action = id_action_p2
     OR id_action = id_action_p3
     OR id_action = id_action_p4
     OR id_action = id_action_p5
     OR id_action = id_action_p6
     OR id_action = id_action_p7
     OR id_action = id_action_p8) 
AND id_action_set = 1
于 2012-06-20T15:06:23.650 回答
0

好的; 首先,您的查询不符合预期。假设您的一个动作有 3 个动作集;id_action_p1, id_action_p2, 和id_action_p3. 这意味着它将显示在Union All查询中的 3 个不同项目中,但具有相同的值 - 因为 id_type 和 value 都不依赖于 id_action。

如果这是有意的,你不能只使用 or - 它只会匹配一次 - 但是你不止一次返回项目而无法区分它们,这看起来很奇怪。如果这是有意的,我们可以通过在表本身中包含项目列表并将其连接起来来使其更简单。

首先,我们设置表:

Select into Table_name id_action_p1 as action
Insert into Table_name (Select id_action_p2)
Insert into Table_name (Select id_action_p3)
Insert into Table_name (Select id_action_p4)
Insert into Table_name (Select id_action_p5)
...

接下来,我们编写新的查询:

SELECT id_type, value 
FROM Action, Action_set, Table_name 
WHERE id_action=Table_name.action
AND id_action_set = 1

这应该与您之前的查询完全一样。

于 2012-06-21T15:49:54.270 回答