我需要从表格中选择一行,该行必须满足以下条件:
到目前为止,我唯一可行的解决方案是:
SELECT <columns>
FROM <table>
WHERE <complex WHERE clause>
AND <columnX> = (SELECT MIN(<columnX>) FROM <table> WHERE <same WHERE clause as before>)
这让我觉得非常丑陋和麻烦,不得不重复两次相同的(复杂的)WHERE子句。
你知道更好的方法吗?
答案 0 :(得分:1)
如果我错了,请纠正我,我会使用CTE(公用表表达式)来编写复杂查询并使用where子句引用它。
希望有所帮助。
答案 1 :(得分:1)
你可以定义一个视图或临时表,性能差异在很大程度上取决于实际问题(你可以尝试两者):
CREATE VIEW v AS
SELECT <columns>
FROM <table>
WHERE <complex WHERE clause>;
SELECT * FROM v
WHERE <columnX> = SELECT min(<columnX> FROM v);
甚至更好,利用窗口功能:
SELECT *
FROM (
SELECT
<columns>,
MIN(<columnX>) OVER () AS minX
FROM <table>
WHERE <complex WHERE clause>
) t
WHERE <columnX> = minX;
http://sqlfiddle.com/#!3/0a52b/6/0
后者当然应该只读一次表。
答案 2 :(得分:1)
原来最简单的解决方案是订购......
SELECT TOP 1 <columns>
FROM <table>
WHERE <complex WHERE clause>
ORDER BY <ColumnX> ASC