首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个CTE上的SQL联接

多个CTE上的SQL联接
EN

Stack Overflow用户
提问于 2017-05-16 15:21:22
回答 1查看 4.2K关注 0票数 1

我必须合并两个查询:

查询1-一个简单的内部连接,其中查询:

代码语言:javascript
复制
Select t1.c1, t1.c2, t1.c3, t2.c1

from s1.t2 t2
inner join s1.t1 t1 on t2.c6 = t1.c6

where t2.c5 >= '2014-01-01'
and t2.c5 >= '2014-01-01'
and t1.c4 = 'P' 

当然,这会返回一个包含4列的表。让我在这里画出来:

代码语言:javascript
复制
+----+----+----+-------+
| C1 | C2 | C3 | T2.C1 |
+----+----+----+-------+
|    |    |    |       |

查询2-使用With,然后使用“分区by”语句删除重复项:

代码语言:javascript
复制
WITH all_col1 (ONE, TWO) AS
(
    SELECT col1, col2
    FROM Schema1.Table1
    UNION
    SELECT col1, col2
    FROM Schema2.Table2
    UNION
    SELECT col1, col2
    FROM Schema2.Table3
)
SELECT *
FROM (
    SELECT  ONE, TWO,
    ROW_NUMBER() OVER(PARTITION BY ONE ORDER BY ONE) duplicate_count
    FROM all_col1
) all_col1_w_duplicat_count
WHERE duplicate_count = 1 

这将返回两个列,删除所有重复项(也就是说,如果第1列有重复项,则额外的行将显式删除):

代码语言:javascript
复制
+-----+-----+
| ONE | TWO |
+-----+-----+
|     |     |

因此,我想看到的是第一个查询和第二个查询的组合,其中两个被添加到一个匹配C1的表中:

代码语言:javascript
复制
+------+----+----+-------+-----+
| C1   | C2 | C3 | T2.C1 | TWO |
|(ONE) |    |    |       |     |
+------+----+----+-------+-----+
|      |    |    |       |     |

因此,我尝试了INTERSECT,添加了占位符行。空回来了。

我也尝试过让查询1成为CTE,然后加入这两者--尝试了无数错误。

到目前为止,我能想到的最好的方法是将查询1与select语句中的查询2连接起来:

代码语言:javascript
复制
--ALL COL1 WITH beginning 

WITH all_col1 (ONE, TWO) AS
(
    SELECT col1, col2
    FROM Schema1.Table1
    UNION
    SELECT col1, col2
    FROM Schema2.Table2
    UNION
    SELECT col1, col2
    FROM Schema2.Table3
)


--ALL COL1 SELECT duplicate_count

SELECT  *
FROM (
    SELECT  ONE, TWO,
    ROW_NUMBER() OVER(PARTITION BY ONE ORDER BY ONE) duplicate_count
    FROM all_col1


    -- added join opperation

    join (


        --SELECT from query 1

        Select t1.c1, t1.c2, t1.c3, t2.c1

        from s1.t2 t2
        inner join s1.t1 t1 on t2.c6 = t5.c6

        where t2.c5 >= '2014-01-01'
        and t2.c5 >= '2014-01-01'
        and t1.c4 = 'P' 


    -- finish join opperation

    ) as query1
    on all_col1.ONE = query1.c1    --  <----MOST IMPORTANT PART


-- finsih ALL COL1

) all_col1_w_duplicat_count
WHERE duplicate_count = 1 

不幸的是,这并没有给出每个查询的第一列连接的结果,就像用on all_col1.ONE = t1.c1询问的结果一样

相反,它似乎只是给了我与all_col1。

我对sql几乎一无所知,为了正确地将这两个查询连接在一起,我需要学习什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-16 17:01:18

考虑加入两个派生表( FROMJOIN子句中的子查询),因为重复计数包括两个表,而不只是一个表:

代码语言:javascript
复制
...
SELECT q.c1, q.c2, q.c3, q.t2_c1, a.[TWO]
FROM
  (
   SELECT *
   FROM (
          SELECT  ONE, TWO,
          ROW_NUMBER() OVER(PARTITION BY ONE ORDER BY ONE) duplicate_count
          FROM all_col1
        ) sub
   WHERE sub.duplicate_count = 1 
  ) a

INNER JOIN 
  (
   SELECT t1.c1, t1.c2, t1.c3, t2.c1 as t2_c1
   FROM s1.t2 t2
   INNER JOIN s1.t1 t1 on t2.c6 = t5.c6
   WHERE t2.c5 >= '2014-01-01'
    AND t2.c5 >= '2014-01-01'
    AND t1.c4 = 'P' 
  ) q

ON a.ONE = q.c1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44005501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档