CTE上的多个

时间:2017-05-16 15:21:23

标签: sql join db2 common-table-expression

我必须结合两个查询:

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

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列的表。让我在这里画出来:

+----+----+----+-------+
| C1 | C2 | C3 | T2.C1 |
+----+----+----+-------+
|    |    |    |       |

查询2 - 使用,然后使用"分区删除重复项"语句:

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列有重复项,则显式删除额外的行):

+-----+-----+
| ONE | TWO |
+-----+-----+
|     |     |

所以我想看到的是第一个查询和第二个查询组合在一起,其中TWO被添加到ONE匹配C1的表中:

+------+----+----+-------+-----+
| C1   | C2 | C3 | T2.C1 | TWO |
|(ONE) |    |    |       |     |
+------+----+----+-------+-----+
|      |    |    |       |     |

所以,我尝试过INTERSECT,添加占位符行。返回空。

我尝试将查询1作为CTE然后加入两者 - 尝试了这一点时遇到了无数错误。

这是迄今为止我能够提出的最好的 - 在查询2的select语句中加入查询1:

--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

询问一样

相反,似乎只是给了我WITH_all_col1。

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

1 个答案:

答案 0 :(得分:1)

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

...
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