我有一个复杂的查询。下面是我想做的最基本的例子。
SELECT
match_by_color AS match_type,
t1.*
FROM t1
WHERE
( t1.color LIKE 'color%') -- match_by_color
OR (t1.type in (select type from t2)) -- match_by_type
OR (t1.name in (select name from t3 WHERE ...)) -- match_by_name
OR (t1.age in (select age from t4 WHERE ...)) -- match_by_age
我有3-4个匹配记录的条件。如果它匹配其中一个条件,我想识别第一个匹配类型,而不需要再次运行子查询。我可以这样做,但我觉得它会运行相同的查询两次。
-- I could do this but it would be running the conditional sub queries twice
(
CASE
WHEN ( t1.color LIKE 'color%') THEN match_by_color
WHEN (t1.type in (select type from t2)) THEN match_by_color
WHEN (t1.name in (select name from t3 WHERE ...)) THEN match_by_name
WHEN (t1.age in (select age from t4 WHERE ...)) THEN match_by_age
ELSE no_match
END
) AS match_type
2条答案
按热度按时间oyjwcjzk1#
试试这个,我遵循@nbk的建议,我也删除了所有的where子句来简化,我想这样会表现得更好。
a14dhokn2#
关于“复杂查询”的问题过于简单化的问题是我们没有意识到复杂性,这将不可避免地对处理查询的最佳方式产生影响。
如果
t1
与t2
、t3
和t4
之间的关系返回0或1行,则值得测试LEFT JOIN
:如果关系可能返回多行,请尝试使用
EXISTS(...)
: