【问题标题】:SQL Server: Performing OUTER APPLY between two subqueriesSQL Server:在两个子查询之间执行 OUTER APPLY
【发布时间】:2018-11-23 13:26:35
【问题描述】:

我想使用 OUTER Apply 从两个子查询中获取结果,但它不起作用。下面我以我正在尝试执行的查询的框架为例:

SELECT DISTINCT D.Field1, D.Field2, S.Field1, S.Field2
FROM (
        SELECT Field1, Field2
        FROM Table1 t1 INNER JOIN Table2 t2 on t1.CommonField = t2.CommonField
                       INNER JOIN Table3 t3 on t3.CommonField = t2.CommonField
                       LEFT JOIN Table4 t4 on t4.CommonField = t3.CommonField
        WHERE t1.Date > '20181011'

     ) D OUTER APPLY
     (
        SELECT Field1, Field2
        FROM Table5 t5 INNER JOIN Table6 t6 on t6.CommonField = t5.CommonField
                       INNER JOIN Table7 t7 on t7.CommonField = t6.CommonField
        WHERE t5.Field4 = 'SomeWhat'
        GROUP BY t5.Date
     ) S

SQL Server 解析器给我一个错误: 'D' 附近的语法错误。

我使用的是 SQL Server 2008。

【问题讨论】:

  • “骨架”在语法上看起来不错。问题出在其他地方。
  • 那个 GROUP BY 在那里做什么?您没有选择 t5.Date 并且没有汇总...
  • 我怀疑这是一个匿名查询(谁会真正将所有对象命名为 table{n}field{n}commonfield,并且不会在几个小时后发疯,因为他们不知道是什么不再是什么了),并且 OP 已经将其匿名化,以至于它已成为一个有效的查询(除了@LordPeter 提到的GROUP BY 问题)。发布您的实际查询,而不是代表它的查询,但不显示您遇到的问题。
  • query s 和 query d 的关系在哪里?
  • 大家好,非常抱歉。我没有发布真正的查询,因为它是机密的。我已经解决了,这是一个缺少的括号。再次非常抱歉,非常感谢您的建议和支持。

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

代码看起来没问题,只是您使用了GROUP BY t5.Date,但选择了其他列,例如Field1, Field2。只需将这些列添加到GROUP BY

SELECT Field1, Field2
FROM Table5 t5 INNER JOIN Table6 t6 on t6.CommonField = t5.CommonField
INNER JOIN Table7 t7 on t7.CommonField = t6.CommonField
WHERE t5.Field4 = 'SomeWhat'
GROUP BY t5.Date, t5.Field1, t5.Field2

让我展示一个工作示例:

DECLARE  @TableA TABLE (
  id BIGINT IDENTITY NOT NULL,
  value nvarchar(max) NOT NULL
);

DECLARE  @TableB TABLE (
  id BIGINT IDENTITY NOT NULL,
  value nvarchar(max) NOT NULL,
  tableARid BIGINT NOT NULL
)

INSERT INTO @TableA(value) VALUES('test');
INSERT INTO @TableB(value, tableARid) VALUES ('test1', 1);
INSERT INTO @TableB(value, tableARid) VALUES ('test2', 1);
INSERT INTO @TableB(value, tableARid) VALUES ('test3', 1);

SELECT
  subQuery.id
, subQuery.value
, oa.id
FROM 
(
    SELECT 
      ta.id
    , ta.value
    FROM @TableA ta
) subQuery
OUTER APPLY 
(
   SELECT 
     tb.id
   , tb.value 
   FROM @TableB tb   
   GROUP BY tb.id, tb.[value]
) oa

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多