【问题标题】:Using OPENQUERY with a table created on the fly将 OPENQUERY 与动态创建的表一起使用
【发布时间】:2013-02-26 07:47:49
【问题描述】:

我有一个由四部分组成的链接服务器查询,它使用 UNION ALL 对动态创建的表进行 LEFT OUTER JOIN,类似于以下内容:

SELECT t.column1, rlt.s6, SUM(t.column3) column3
FROM Linked_server.database.schema.table t
    LEFT OUTER JOIN (
        SELECT 1 AS s7, 15 AS s6
        UNION ALL SELECT 3, 1
        UNION ALL SELECT 20, 16
    ) rlt ON (rlt.s7 = t.column2)

效果很好。但是,当我使用 OPENQUERY 函数运行相同的查询时,就像这样:

SELECT * FROM OPENQUERY(Linked_server, '
    SELECT t.column1, rlt.s6, SUM(t.column3) column3
    FROM database.schema.table t
        LEFT OUTER JOIN (
            SELECT 1 AS s7, 15 AS s6
            UNION ALL SELECT 3, 1
            UNION ALL SELECT 20, 16
        ) rlt ON (rlt.s7 = t.column2)
')

,LEFT OUTER JOIN 失败并且 s6 列仅包含 NULL。我知道我可以重写查询 #2 以使其工作,但我很好奇为什么它不能按照它的编写方式工作?是不是因为我不知道对 OPENQUERY 有一些限制?

【问题讨论】:

    标签: sql sql-server union-all openquery


    【解决方案1】:

    无法在我的机器上重现它...唯一的区别在于两个查询的排序顺序。也许只是在视觉上看起来结果集因排序顺序不同而有所不同。尝试在两个查询中添加 ORDER BY rlt.s6 DESC 然后运行它们,这应该会为您提供以相同顺序排列的相同记录的结果集。

    【讨论】:

    • 事实证明你是对的,NULL 值冒泡到顶部只是因为 OPENQUERY 隐式地将不同的排序顺序应用于结果集。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多