2017-05-16 119 views
1

我要合并这两个查询:SQL连接多个

查询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 | 
+-----+-----+ 
|  |  | 

所以我想看到的是第一个查询和第二查询合并这样的,其中两个被添加到表,其中ONE matches 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几乎一无所知,为了正确地将这两个查询连接在一起,我需要学习什么?

+0

能否请你告诉样本数据和预期的效果?我无法按照您的要求单独处理查询...... – Siyual

+0

您的第二个查询方式过于复杂。 'UNION'删除重复项。 –

+0

@Siyual对不起,我应该第一次添加这些视觉效果。我现在加了他们。 –

回答

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