I have one query that uses one join already, call it query1. I would like to join query1 to the results of a WITH clause. I don’t know how to merge the two data sets.
Query 1:
SELECT 
    p.NetObjectID 
    , n.Caption, n.ObjectSubType
FROM Pollers p
LEFT JOIN NodesData n ON n.NodeID = p.NetObjectID
The next query is a WITH clause. I don’t know how to obtain the results without a WITH because I need to do what is outlined in this post.
Query 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;
I thought I could just JOIN ranked_DateStamp ON ranked_DateStamp.NodeID = p.NodeID but it won’t allow it.
Advertisement
Answer
You don’t really need a with clause here, you can use a subquery. I would just phrase this as:
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
However, if you were to use a common table expression, that would look like:
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
Actually, a lateral join might perform equally well, or better:
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