【问题标题】:Need help in Cross Joins在交叉连接方面需要帮助
【发布时间】:2018-08-08 07:03:35
【问题描述】:
SELECT * 
FROM 
    (SELECT 
         SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR 
     FROM 
         INSIGHTSOURCE.BS.RE_CRF_GL 
     WHERE 
         CONSOL_KEY10 = 'CUR' 
     GROUP BY 
         Consol_Key10

     CROSS JOIN

     SELECT 
         SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR 
     FROM 
         INSIGHTSOURCE.BS.RE_CRF_GL 
     WHERE 
         CONSOL_KEY10 IN ('REG','WCL') 
     GROUP BY 
         Consol_Key10

     CROSS JOIN

     SELECT 
         SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR 
     FROM 
         INSIGHTSOURCE.BS.RE_CRF_GL 
     WHERE 
         CONSOL_KEY10 IN ('OAM', 'SUB') 
     GROUP BY 
         Consol_Key10

     CROSS JOIN

     SELECT 
         SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR 
     FROM 
         INSIGHTSOURCE.BS.RE_CRF_GL 
     WHERE 
         CONSOL_KEY10 IN ('DBT', 'LOS') 
     GROUP BY 
         Consol_Key10

     CROSS JOIN

     SELECT 
         SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR 
     FROM 
         INSIGHTSOURCE.BS.RE_CRF_GL 
     WHERE 
         CONSOL_KEY10 IN ('CHO') 
     GROUP BY 
         Consol_Key10
)

我收到以下错误:

消息 156,第 15 级,状态 1,第 4 行
关键字“CROSS”附近的语法不正确。

消息 156,第 15 级,状态 1,第 6 行
关键字“CROSS”附近的语法不正确。

消息 156,第 15 级,状态 1,第 8 行
关键字“CROSS”附近的语法不正确。

消息 156,第 15 级,状态 1,第 10 行
关键字“CROSS”附近的语法不正确。

消息 102,第 15 级,状态 1,第 12 行
')' 附近的语法不正确。

【问题讨论】:

  • 采取更小的步骤。使用一个交叉连接创建一个小查询。然后进行下一步。
  • 您希望输出中有多少列和行?
  • 您有 5 列,全称为 DR,包含各种不同的值。当无法区分每个查询的结果时,您打算如何访问这些数据?
  • 我会尝试 UNION ALL 而不是 CROSS JOIN。

标签: sql-server select subquery


【解决方案1】:

为每个子查询使用别名和括号

SELECT * FROM (
(SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 = 'CUR' GROUP BY Consol_Key10) AS t1
CROSS JOIN
(SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('REG','WCL') GROUP BY Consol_Key10) AS t2
CROSS JOIN
(SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('OAM','SUB') GROUP BY Consol_Key10) AS t3
CROSS JOIN
(SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('DBT','LOS') GROUP BY Consol_Key10) AS t4
CROSS JOIN
(SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('CHO') GROUP BY Consol_Key10) AS t5
)

【讨论】:

    【解决方案2】:

    子查询属于括号。大多数 DBMS 还需要它们的名称:

    SELECT * 
    FROM
      (SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR
       FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 = 'CUR' GROUP BY Consol_Key10) q1
    CROSS JOIN
      (SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR
       FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('REG','WCL') GROUP BY Consol_Key10) q2
    CROSS JOIN
      (SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR
       FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('OAM','SUB') GROUP BY Consol_Key10) q3
    CROSS JOIN
      (SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR
       FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('DBT','LOS') GROUP BY Consol_Key10) q4
    CROSS JOIN
      (SELECT SUM(CASE WHEN LOCAL_CCY_AMT < 0 THEN LOCAL_CCY_AMT END) AS DR
       FROM INSIGHTSOURCE.BS.RE_CRF_GL WHERE CONSOL_KEY10 IN ('CHO') GROUP BY Consol_Key10) q5;
    

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2011-03-11
      • 1970-01-01
      • 2011-07-02
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多