CROSS中的SQL Server 2014 UNION应用程序

时间:2016-06-09 18:08:45

标签: sql-server union cross-apply

我有以下查询

SELECT DISTINCT 
    d.UserName, 
    i.itemID, 
    d.Score, 
    d.StoreCode, 
    d.Location
FROM 
    G.dbo.Users d
LEFT JOIN 
    G.dbo.Emails s on d.UserName=s.UserName
CROSS APPLY 
    (
        SELECT TOP (1) 
            ii.ItemID 
        FROM 
            G.dbo.Dump ii
        WHERE 
            ii.Username=d.UserName
        AND 
            ii.endTime>DATEADD(hh,3,getDate())
    ) i
WHERE 
    s.serName is null
AND 
    d.Score>@_Score
AND 
    (d.processed=0)
GROUP BY 
    d.UserName, 
    i.itemID, 
    d.Score, 
    d.StoreCode, 
    d.Location
ORDER BY 
    d.UserName ASC

现在我需要对其进行修改,因为表格G.dbo.Dump已被拆分为20个较小的表格,现在我已Dump_00Dump_19了 我尝试以这种方式使用CROSS APPLY修改UNION部分的一部分

CROSS APPLY 
(
    SELECT TOP (1) 
        ii.ItemID
    FROM
        (
            SELECT TOP (1) FROM G.dbo.Dump_00
            UNION
            SELECT TOP (1) FROM G.dbo.Dump_01
            UNION
            .....
            SELECT TOP (1) FROM G.dbo.Dump_19
        ) ii
    WHERE 
        ii.UserName=d.UserName
    AND 
        ii.EndTime>DATEADD(hh,3,getDate())
) i

但结果未按预期工作

可以建议UNION是否是正确的方式以及如何申请或其他解决方案?

谢谢!

1 个答案:

答案 0 :(得分:2)

从union元素中删除TOP 1。不知道为什么添加。从逻辑上讲,你是在一个集合之后,它是所有表的联合。

另外,我认为你根本不需要工会。你想要连接。

CROSS APPLY 
(
    SELECT TOP (1) ii.ItemID
    FROM
        (
            SELECT FROM G.dbo.Dump_00 --changed
            UNION ALL --changed
            SELECT FROM G.dbo.Dump_01 --changed
            .....
        ) ii
) i