使用子查询会导致条件

时间:2018-10-14 21:46:26

标签: sql sql-server tsql

我遇到一个可能无法执行的简单查询的问题。我也不确定如何使用Google。这样就可以了。

我有2张桌子:

  • TableA-存放我需要返回的主要记录
  • TableB-TableA中的每个记录可容纳许多记录

我要做的就是从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。

希望我已经以某种方式解释了它,您可以了解我要完成的工作。

3 个答案:

答案 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
相关问题