【问题标题】:Performing a JOIN with the results of a WITH clause使用 WITH 子句的结果执行 JOIN
【发布时间】:2020-08-27 10:27:16
【问题描述】:

我有一个查询已经使用了一个连接,称之为 query1。我想将 query1 加入 WITH 子句的结果。我不知道如何合并两个数据集。

查询一:

SELECT 
    p.NetObjectID 
    , n.Caption, n.ObjectSubType
FROM Pollers p
LEFT JOIN NodesData n ON n.NodeID = p.NetObjectID

下一个查询是 WITH 子句。我不知道如何在没有 WITH 的情况下获得结果,因为我需要执行this post 中概述的操作。

查询 2:

WITH ranked_DateStamp AS 
(
    SELECT c.NodeID, c.DateTime
        , ROW_NUMBER() OVER (PARTITION BY NodeID ORDER BY DateTime DESC) AS rn
    FROM CPULoad AS c
)
SELECT *
FROM ranked_DateStamp
WHERE rn = 1;

我以为我可以在ranked_DateStamp.NodeID = p.NodeID 上加入ranked_DateStamp,但它不允许。

【问题讨论】:

  • 为什么不只是JOIN他们?

标签: sql sql-server tsql join window-functions


【解决方案1】:

实际上,我会建议一种不同的方法——横向连接:

SELECT p.NetObjectID, n.Caption, n.ObjectSubType,c.DateTime
FROM Pollers p LEFT JOIN
     NodesData n
     ON n.NodeID = p.NetObjectID OUTER APPLY
     (SELECT TOP (1) NodeID, DateTime, 
        ROW_NUMBER() OVER (PARTITION BY NodeID ORDER BY DateTime DESC) AS rn
      FROM CPULoad c
      WHERE c.NodeId = p.NetObjectID
      ORDER BY DateTime DESC
     ) c;

横向连接非常强大,值得学习。它们通常也比 ROW_NUMBER() 方法快一点。

【讨论】:

    【解决方案2】:

    真的在这里不需要with 子句,您可以使用子查询。我只是将其表述为:

    SELECT 
        p.NetObjectID, 
        n.Caption, 
        n.ObjectSubType,
        c.DateTime
    FROM Pollers p
    LEFT JOIN NodesData n ON n.NodeID = p.NetObjectID
    LEFT JOIN (
        SELECT 
            NodeID, 
            DateTime, 
            ROW_NUMBER() OVER (PARTITION BY NodeID ORDER BY DateTime DESC) AS rn
        FROM CPULoad AS c
    ) c ON c.rn = 1 and c.NodeID = p.NetObjectID
    

    但是,如果您要使用公用表表达式,则如下所示:

    WITH ranked_DateStamp AS (
        SELECT 
            NodeID, 
            DateTime, 
            ROW_NUMBER() OVER (PARTITION BY NodeID ORDER BY DateTime DESC) AS rn
        FROM CPULoad AS c
    )
    SELECT 
        p.NetObjectID, 
        n.Caption, 
        n.ObjectSubType,
        c.DateTime
    FROM Pollers p
    LEFT JOIN NodesData n ON n.NodeID = p.NetObjectID
    LEFT JOIN ranked_DateStamp c ON c.rn = 1 and c.NodeID = p.NetObjectID
    

    实际上,横向连接的性能可能同样好,甚至更好:

    SELECT 
        p.NetObjectID, 
        n.Caption, 
        n.ObjectSubType,
        c.DateTime
    FROM Pollers p
    LEFT JOIN NodesData n ON n.NodeID = p.NetObjectID
    OUTER APPLY (SELECT TOP (1) * FROM CPULOad c WHERE c.NodeID = p.NetObjectID ORDER BY DateTime DESC) c
    

    【讨论】:

    • 是的,这三个正是我继续下去所需要的!非常感谢!!!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    相关资源
    最近更新 更多