例如我有一个查询:
SELECT s.e ,
v.T ,
v.G ,
CASE WHEN ( s.a = 'M'
AND s.b = 'N'
AND s.c = 'O'
AND s.d = 'P'
AND s.e = 'Q'
) THEN '0'
WHEN ( s.a = 'M'
AND s.b = 'N'
AND s.c = 'O'
AND s.d = 'P'
) THEN '1'
ELSE '2'
END AS type
FROM table_v AS v
LEFT OUTER JOIN table_s AS s ON ( v.a = s.a
AND v.b = s.b
AND v.c = s.c
)
WHERE ( s.a = 'M'
AND s.b = 'N'
AND s.c = 'O'
AND s.d = 'P'
AND s.e = 'Q'
)
OR ( s.a = 'M'
AND s.b = 'N'
AND s.c = 'O'
AND s.d = 'P'
)
OR ( s.a = 'M'
AND s.b = 'N'
)
如果第一个成功,有没有办法在 WHERE 子句中不运行第二个 OR 。第二个 OR 相同,如果第一个失败而第二个成功,则忽略第三个语句。目前我正在 SELECT 中使用一个案例来过滤出我需要的内容。在这种情况下,我必须在根据 CASE 类型的值检索结果集后再次循环,这会减慢一切。
我还考虑过为每个 OR 语句分别执行 UNION,但即使在这种情况下,也无法执行“BREAK”
还研究了 where 子句中的 CASE,但这也会减慢速度,并且仍然会得到多个我并不真正需要的结果。
最佳答案
当您在左连接表上使用 where 子句条件时,您会覆盖该表行不存在的能力(除非您允许 NULL)。在这种情况下,每个过滤条件都要求存在 table_s 中的行,因此您应该使用更有效的内部联接。
FROM table_v AS v
INNER JOIN table_s AS s ON ( v.a = s.a
AND v.b = s.b
AND v.c = s.c
)
where 子句中没有“break”功能。然而,您当前的条件似乎并未形成排他子集,因为所有集合 1 (M+N+O+P+Q) 都适合集合 2 (M+N+O+P),而集合 2 (M+N+O+P) 又适合集合 3 (M +N)
您是否需要附加条件才能使其具有排他性?
WHERE ( s.a = 'M'
AND s.b = 'N'
AND s.c = 'O'
AND s.d = 'P'
AND s.e = 'Q'
)
OR ( s.a = 'M'
AND s.b = 'N'
AND s.c = 'O'
AND s.d = 'P'
AND NOT s.e = 'Q'
)
OR ( s.a = 'M'
AND s.b = 'N'
AND NOT (
s.c = 'O'
AND s.d = 'P'
AND s.e = 'Q'
)
)
关于mysql - 有没有办法在第一个条件匹配的情况下限制sql命令的运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32366126/