首页 > 解决方案 > 在 where 条件下使用子查询结果

问题描述

我遇到了一个可能很简单的查询问题,我无法正常工作。我也不完全确定如何谷歌它。就这样吧。

我有 2 张桌子:

我需要做的就是从 TableA 返回匹配查询的记录,例如:

SELECT Description, Type, Status
FROM TableA
WHERE Status = 2;

但是最后有这个额外的位(我知道查询是错误的,但希望它能让您了解我所追求的(伪代码):

SELECT ID, Description, Type, Status
FROM TableA
JOIN TableB ON TableB.ID = TableA.ID
WHERE Status = 2
AND (MIN(TableB.StatusChanged) > DATEADD(minute, -15, GETDATE()))
AND TableB.Status < 5;

所以基本上我想从TableA返回所有记录,只要它们在TableA中的状态为2,并且TableB中最早的记录至少有15分钟,并且状态值小于5。

希望我以一种您可以理解我要完成的工作的方式对其进行了解释。

标签: sqlsql-servertsql

解决方案


用于CROSS APPLY模拟连接并仅获取第一个匹配项:

SELECT a.Description, a.Type, a.Status, b.*
FROM TableA a
    CROSS APPLY (
        SELECT TOP 1 *
        FROM TableB b
        WHERE a.ID = b.ID -- the join condition
            AND b.Status < 5
            AND b.StatusChanged < DATEADD(MINUTE, -15, GETDATE()
        ORDER BY b.StatusChanged -- the earliest one that matches
    ) b
WHERE a.Status = 2;

推荐阅读