如何选择与复杂WHERE子句匹配且在给定列中具有最小值的行?

时间:2014-03-02 23:23:12

标签: sql sql-server select where

我需要从表格中选择一行,该行必须满足以下条件:

  • 它需要匹配一个非常复杂的WHERE子句
  • 它需要在第X列中具有最小值

到目前为止,我唯一可行的解​​决方案是:

SELECT <columns>
FROM <table>
WHERE <complex WHERE clause>
AND <columnX> = (SELECT MIN(<columnX>) FROM <table> WHERE <same WHERE clause as before>)

这让我觉得非常丑陋和麻烦,不得不重复两次相同的(复杂的)WHERE子句。

你知道更好的方法吗?

3 个答案:

答案 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