SQL - 来自 JOIN 的最小值

SQL - Minimum from a JOIN

我要加入几个 table。从加入的 table 我需要 select 一个列中具有最小值的记录。 where 子句包含一些附加条件。如何在不必在 select 和 where 子句中列出整个连接来确定最小值的情况下实现这一点?

我的意思是 - 根据连接的结果,我需要 select 一条满足某些条件并且还包括特定列中的最小值的记录。它在 Teradata 中,但我问的是一般原则。

我有这样的东西。它有效,但很丑陋,因为连接包含两次。

SELECT TABLE1.X, TABLE2.Y, TABLE3.Z  
FROM TABLE1  
INNER JOIN TABLE2     
ON TABLE1.A = TABLE2.B  
INNER JOIN TABLE3  
ON TABLE2.C=TABLE3.D  
WHERE TABLE3.M =  
   (SELECT MIN(TABLE3.M)
    FROM TABLE1  
    INNER JOIN TABLE2  
    ON TABLE1.A = TABLE2.B  
    INNER JOIN TABLE3  
    ON TABLE2.C=TABLE3.D
    WHERE TABLE1.K=123 AND TABLE2.L=456
   )

谢谢,R.

使用min window函数如下:

Select x, y, z from
(SELECT TABLE1.X, TABLE2.Y, TABLE3.Z,
       Min(TABLE3.M) over () as mn,
       TABLE3.M
FROM TABLE1  
INNER JOIN TABLE2     
ON TABLE1.A = TABLE2.B  
INNER JOIN TABLE3  
ON TABLE2.C=TABLE3.D 
Where TABLE1.K=123 AND TABLE2.L=456 ) t
Where m = mn

在评论中您说您只需要一行作为输出。

在这种情况下,使用 ORDER BYLIMIT 1

SELECT TABLE1.X, TABLE2.Y, TABLE3.Z  
FROM TABLE1  
INNER JOIN TABLE2     
ON TABLE1.A = TABLE2.B  
INNER JOIN TABLE3  
ON TABLE2.C=TABLE3.D  
WHERE TABLE1.K=123 AND TABLE2.L=456
ORDER BY TABLE3.M
LIMIT 1

编辑:(使用 min() 来满足未说明的要求...)

SELECT
    X, Y, Z
FROM
(
    SELECT
        TABLE1.X,
        TABLE2.Y,
        TABLE3.Z,
        TABLE3.M,
        MIN(TABLE3.M) OVER () AS MIN_M
    FROM
        TABLE1  
    INNER JOIN
        TABLE2     
            ON TABLE1.A = TABLE2.B  
    INNER JOIN
        TABLE3  
            ON TABLE2.C = TABLE3.D  
    WHERE
            TABLE1.K = 123
        AND TABLE2.L = 456
)
    AS FILTERED
WHERE
    MIN_M = M

即使我打算为此使用 window 函数,我也会使用 ROW_NUMBER()RANK() 而不是使用 MIN()。没有明确的理由为什么你觉得必须使用它,但仍然是干的、高效的和可维护的,这个约束似乎不仅毫无意义,而且被误导了。

如果我没看错,你可以使用qualify:

SELECT TABLE1.X, TABLE2.Y, TABLE3.Z  
FROM TABLE1 INNER JOIN
     TABLE2     
     ON TABLE1.A = TABLE2.B INNER JOIN
     TABLE3  
     ON TABLE2.C = TABLE3.D  
QUALIFY TABLE3.M = MIN(CASE WHEN TABLE1.K = 123 AND TABLE2.L = 456 THEN TABLE3.M END) OVER ();