where语句在内连接之前执行

时间:2018-02-12 11:00:12

标签: sql sql-server select inner-join

我尝试使用小于4的sysAddress来获取每个结果的第一个实例。但是我的语句当前在应用where sysAddress<之前首先获取了min(actionTime)结果。 4.我试图将内连接的输入作为where sysAddress<但是我似乎无法弄清楚如何去做。

我应该以不同方式嵌套它吗?我不想创建一个额外的表连接层。这可能吗?我找到的所有答案都有点迷失。

    SELECT
  tblHistoryObject.info,
  tblHistory.actionTime,
  tblHistoryUser.userID,
  tblHistoryUser.firstName,
  tblHistoryUser.surname,
  tblHistory.eventID,
  tblHistoryObject.objectID,
  tblHistorySystem.sysAddress

FROM tblHistoryObject


JOIN tblHistory
  ON (tblHistory.historyObjectID = tblHistoryObject.historyObjectID)
JOIN tblHistorySystem
  ON (tblHistory.historySystemID = tblHistorySystem.historySystemID)
JOIN tblHistoryUser
  ON (tblHistory.historyUserID = tblHistoryUser.historyUserID)


INNER JOIN (SELECT
  MIN(actionTime) AS recent_date,
  historyObjectID
FROM tblHistory
GROUP BY historyObjectID) AS t2
  ON t2.historyObjectID = tblHistoryObject.historyObjectID
  AND tblHistory.actionTime = t2.recent_date


WHERE sysAddress < 4
ORDER BY actionTime ASC

1 个答案:

答案 0 :(得分:1)

WITH
  all_action_times AS
(
    SELECT
      tblHistoryObject.info,
      tblHistory.actionTime,
      tblHistoryUser.userID,
      tblHistoryUser.firstName,
      tblHistoryUser.surname,
      tblHistory.eventID,
      tblHistoryObject.objectID,
      tblHistorySystem.sysAddress,
      ROW_NUMBER() OVER (PARTITION BY tblHistoryObject.historyObjectID
                             ORDER BY tblHistory.actionTime
                        )
                          AS historyObjectID_SeqByActionTime
    FROM
      tblHistoryObject
    INNER JOIN
      tblHistory
        ON tblHistory.historyObjectID = tblHistoryObject.historyObjectID
    INNER JOIN
      tblHistorySystem
        ON tblHistory.historySystemID = tblHistorySystem.historySystemID
    INNER JOIN
      tblHistoryUser
        ON tblHistory.historyUserID = tblHistoryUser.historyUserID
    WHERE
      tblHistorySystem.sysAddress < 4
)
SELECT
  *
FROM
  all_action_times
WHERE
  historyObjectID_SeqByActionTime = 1
ORDER BY
  actionTime ASC

这与您的原始查询完全相同,而不是尝试按action_time进行过滤。

然后,它会附加一个新列,使用ROW_NUMBER()为每个1生成来自tblHistoryObject.historyObjectID的序列。 然后 在{{1}中排序时,它只需要此序列值为1 的行(每historyObjectID的第一行)订购)