我遇到一个可能无法执行的简单查询的问题。我也不确定如何使用Google。这样就可以了。
我有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。
希望我已经以某种方式解释了它,您可以了解我要完成的工作。
答案 0 :(得分:0)
使用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;
答案 1 :(得分:0)
我认为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 AND -- the join condition
b.StatusChanged < DATEADD(MINUTE, -15, GETDATE())
ORDER BY b.StatusChanged -- the earliest one that matches
) b
WHERE a.Status = 2 AND b.Status < 5;
答案 2 :(得分:0)
我会把您的支票转过来,然后使用not exists
SELECT ID, Description, Type, Status
FROM TableA
JOIN TableB ON TableB.ID = TableA.ID
AND TableB.Status < 5
AND not exists (
select * from TableB B2 where B2.ID=TableB.ID and B2.StatusChanged < DATEADD(minute, -15, GETDATE())
)
WHERE TableA.Status = 2