【问题标题】:Issue with full outer join in SQL ServerSQL Server 中的完全外连接问题
【发布时间】:2016-06-22 11:00:29
【问题描述】:

当我分别使用以下 2 个查询时,我会成功获得输出

查询 #1

DECLARE @ID VARCHAR(1000) 
SET @ID = '' 

SELECT @ID = @ID + CAST(int_ID AS VARCHAR(1000)) 
FROM MATRIX_RELATIONSHIP 

SELECT COUNT(int_ID) [Count], YEAR(dt_5841_OF) [date] 
FROM TRANS_IDENTIFICATIONS 
WHERE smallint_209_ME = 4 
  AND CHARINDEX(CONVERT(VARCHAR, int_ID), ('''' + Replace((@ID),',',''',''') + '''')) > 0 
GROUP BY YEAR(dt_5841_OF);

输出:

        Count | year
          02    2016

查询 #2

SELECT 
    COUNT(*) [Count1], YEAR(dt_modifiedOn) [date]
FROM 
    MATRIX_RELATIONSHIP 
GROUP BY 
    YEAR(dt_modifiedOn);

输出:

        Count | year
          02    2016

但是当我使用这两个查询来形成full outer join 时,如下所示:

SELECT 
    tab1.Count, tab2.Count1, tab1.date 
FROM
    (DECLARE @ID VARCHAR(1000) 
     SET @ID = '' 

     SELECT @ID = @ID+CAST(int_ID AS VARCHAR(1000)) 
     FROM MATRIX_RELATIONSHIP 

     SELECT COUNT(int_ID) [Count], YEAR(dt_5841_OF) [date] 
     FROM TRANS_IDENTIFICATIONS 
     WHERE smallint_209_ME = 4 
       AND CHARINDEX(convert(varchar,int_ID),  ('''' + Replace((@ID),',',''',''') + '''')) > 0 
     GROUP BY YEAR(dt_5841_OF)) tab1
FULL OUTER JOIN 
    (SELECT COUNT(*) [Count1], YEAR(dt_modifiedOn) [date]
     FROM MATRIX_RELATIONSHIP 
     GROUP BY YEAR(dt_modifiedOn)) tab2 ON tab1.date = tab2.date;

我收到以下错误:

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

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

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

预期结果

Count | Count1 | year 
  02      02     2016

编辑

我也尝试在查询之外放置声明和设置,但问题仍然存在

DECLARE  @ID VARCHAR(1000) SET @ID=''
 SELECT tab1.Count,tab2.Count1,tab1.date from
( SELECT @ID= @ID+CAST(int_ID AS VARCHAR(1000)) 
from MATRIX_RELATIONSHIP SELECT COUNT(int_ID)[Count],YEAR(dt_5841_OF)[date] FROM TRANS_IDENTIFICATIONS WHERE smallint_209_ME=4 and CHARINDEX(convert(varchar,int_ID),  ('''' + Replace((@ID),',',''',''') + '''')) > 
0 GROUP BY YEAR(dt_5841_OF)) tab1
FULL OUTER JOIN 
(SELECT COUNT(*)[Count1],YEAR(dt_modifiedOn)[date]
 FROM MATRIX_RELATIONSHIP GROUP BY YEAR(dt_modifiedOn)) tab2
 ON tab1.date=tab2.date;

这会导致另一组错误:

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

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:
        DECLARE  @ID VARCHAR(1000) 
        SET @ID='';
    
        SELECT @ID = @ID + CAST(int_ID AS VARCHAR(1000)) from MATRIX_RELATIONSHIP;
    
        SELECT MAX(Count) AS Count, MAX(Count1) AS Count1, date
        FROM
        (
    
            SELECT COUNT(int_ID)[Count], null AS [Count1], YEAR(dt_5841_OF)[date] 
            FROM TRANS_IDENTIFICATIONS 
            WHERE smallint_209_ME = 4 
            and CHARINDEX(convert(varchar,int_ID),  ('''' + Replace((@ID),',',''',''') + '''')) > 
            0 GROUP BY YEAR(dt_5841_OF)
            UNION ALL
            SELECT NULL AS [Count],  COUNT(*)[Count1],YEAR(dt_modifiedOn)[date]
            FROM MATRIX_RELATIONSHIP 
            GROUP BY YEAR(dt_modifiedOn)
        )AS temp 
        GROUP BY [date]
    

    【讨论】:

      【解决方案2】:

      这不是有效的发件人
      这是两个选择语句

      from
      ( DECLARE  @ID VARCHAR(1000) 
        SET @ID='' SELECT @ID= @ID+CAST(int_ID AS VARCHAR(1000)) 
                   from MATRIX_RELATIONSHIP 
      
        SELECT COUNT(int_ID)[Count],YEAR(dt_5841_OF)[date] 
        FROM TRANS_IDENTIFICATIONS 
        WHERE smallint_209_ME=4 
        and CHARINDEX(convert(varchar,int_ID), ('''' + Replace((@ID),',',''',''') + '''')) > 0 
        GROUP BY YEAR(dt_5841_OF)
      )
      

      【讨论】:

        【解决方案3】:

        您的 DECLARE 和 SET 必须在 SELECT 之外。但它的目的是什么?

        【讨论】:

        • @SiddP 与 SELECT @ID= 相同 - 它不属于完全连接。
        【解决方案4】:

        从 select 语句中删除 DECLARE @ID VARCHAR(1000);
        SET @ID=''
        还要在语句顶部声明变量 而是编写两个单独的选择语句,在 int_id 上使用内部联接,然后进行外部联接,它将起作用

        【讨论】:

        • 我已经试过了,你可以看到有问题的。它导致错误
        【解决方案5】:

        声明@ID VARCHAR(1000) 设置@ID = '' 选择 * 从 ( SELECT @ID+ CAST(MATRIX_RELATIONSHIP.int_ID AS varchar(1000)) AS count1, COUNT(TRANS_IDENTIFICATIONS.int_ID) AS count2, YEAR(TRANS_IDENTIFICATIONS.dt_5841_OF) AS date1 FROM MATRIX_RELATIONSHIP INNER JOIN MATRIX_RELATIONSHIP.int_ID 上的 TRANS_IDENTIFICATIONS = TRANS_IDENTIFICATIONS.int_ID WHERE (TRANS_IDENTIFICATIONS.smallint_209_ME = 4) AND (CHARINDEX(CONVERT(varchar, TRANS_IDENTIFICATIONS.int_ID), '''' + REPLACE(@ID, ',', ''',''') + '''') > 0) 按年分组(TRANS_IDENTIFICATIONS.dt_5841_OF),MATRIX_RELATIONSHIP.int_ID 联盟 ( SELECT '' as count1, COUNT(*) [Count2], YEAR(dt_modifiedOn) [date1] FROM MATRIX_RELATIONSHIP 按年分组(dt_modifiedOn) ) ) 作为 tbl

        我希望这对你有用...请告诉我

        【讨论】:

          猜你喜欢
          • 2018-07-12
          • 1970-01-01
          • 2012-01-06
          • 1970-01-01
          • 2010-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多