我必须结合两个查询:
查询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几乎一无所知,为了正确地将这两个查询连接起来,我需要学习什么?
答案 0 :(得分:1)
考虑通过两个派生表(FROM
和JOIN
子句中的子查询)加入,因为您的重复计数包括两个表而不只是一个:
...
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