我想加入包含以下内容的表:激进,符号,日期和年份。有时表1中的部首和年份与表2相同。所以我的加入应该尊重这三个条件:
1)如果tab1的基础= tab2的基础和年份不同,则加入
2)如果tab1的基数= tab2的基数和tab1的年份= tab2的年份和tab1的注释= tab2的注释,则保留一份没有重复的副本。
3)如果tab1的基础= tab2的基础和tab1的年份= tab2的年份和tab1的注释不同于tab2的注释复制日期更近的那个例如保持01/12/2015而不是01 /二千零十五分之十
这是一个数据示例:
第一张表
RADICAL NOTE DEAR DATE
5466 A 2014 01/10/2014
5309 B 2014 01/10/2014
1245 A 2015 01/10/2015
9084 D 2013 01/10/2013
5849 E 2012 01/10/2012
2344 C 2016 01/10/2016
5466 D 2016 01/10/2016
第二张表
5466 A 2014 01/10/2014
5309 C 2015 01/10/2015
1245 D 2015 01/12/2015
9084 D 2013 01/10/2013
5849 E 2015 01/10/2015
2344 C 2016 01/10/2016
5849 E 2015 01/10/2015
RESULT
5466 A 2014 01/10/2014
5309 C 2015 01/10/2015
5309 B 2014 01/10/2014
1245 D 2015 01/12/2015
9084 D 2013 01/10/2013
5849 E 2015 01/10/2015
5849 E 2012 01/10/2012
2344 C 2016 01/10/2016
5466 D 2016 01/10/2016
这只是两个表的一个例子,我可能有大约8个表加入相同的条件。 查询尝试:
Select *
from tab (
if tab.RADICAL=tab2.RADICAL and tab.year=tab2.year and tab.note!=tab2.note
else
if tab.Radical=tab2.Radical and tab.year!=tab2.year
else
if tab.Radical=tab2.Radical and tab.year=tab2.year and tab.note=tab2.note keep top date )
then full outer join tab2
非常感谢任何帮助。
其他用户使用耗材格式的示例数据:
CREATE TABLE #Radical1 (Radical smallint,
Note char(1),
[Year] smallint,
[Date] date);
CREATE TABLE #Radical2 (Radical smallint,
Note char(1),
[Year] smallint,
[Date] date);
INSERT INTO #Radical1
VALUES (5466,'A',2014,'20141001'),
(5309,'B',2014,'20141001'),
(1245,'A',2015,'20151001'),
(9084,'D',2013,'20131001'),
(5849,'E',2012,'20121001'),
(2344,'C',2016,'20161001'),
(5466,'D',2016,'20161001');
INSERT INTO #Radical2
VALUES (5466,'A',2014,'20141001'),
(5309,'C',2015,'20151001'),
(1245,'D',2015,'20151001'),
(9084,'D',2013,'20131001'),
(5849,'E',2015,'20151001'),
(2344,'C',2016,'20161001'),
(5849,'E',2015,'20151001');
GO
DROP TABLE #Radical1;
DROP TABLE #Radical2;
答案 0 :(得分:0)
我认为这就是你所追求的。老实说,你定义的逻辑毫无意义,所以我完全按照你预期的结果集工作。它匹配,但我不知道它是否真的适用于更广泛的数据。
--Expected results
SELECT Radical, Note,
[Year],
CONVERT(date, [date]) AS [Date] --Please consider better names for your columns.
FROM (VALUES(5466,'A',2014,'20141001'),
(5309,'C',2015,'20151001'),
(5309,'B',2014,'20141001'),
(1245,'D',2015,'20151001'),
(9084,'D',2013,'20131001'),
(5849,'E',2015,'20151001'),
(5849,'E',2012,'20121001'),
(2344,'C',2016,'20161001'),
(5466,'D',2016,'20161001')) V(Radical, Note, [Year], [Date])
ORDER BY [Date], Radical, Note;
--Results
WITH RNs AS(
SELECT ISNULL(R2.Radical,R1.Radical) AS Radical,
ISNULL(R2.Note,R1.Note) AS Note,
ISNULL(R2.[Year],R1.[Year]) AS [Year],
ISNULL(R2.[Date],R1.[Date]) AS [Date],
ROW_NUMBER() OVER (PARTITION BY ISNULL(R2.Radical,R1.Radical), ISNULL(R2.[Year],R1.[Year])
ORDER BY ISNULL(R2.[Date],R1.[Date]) DESC) AS RN
FROM #Radical1 R1
FULL OUTER JOIN #Radical2 R2 ON R1.Radical = R2.Radical
AND R1.[Year] = R2.[Year])
SELECT Radical,
Note,
[Year],
[Date]
FROM RNs
WHERE RN = 1
ORDER BY [Date], Radical, Note;
答案 1 :(得分:0)
好像你不需要join
。但这取决于你的数据。特别是在Date
列中。 Union
可以处理前两个条件。此查询返回您的预期输出
select
top 1 with ties *
from (
select * from #Radical1
union
select * from #Radical2
) t
order by row_number() over (partition by Radical, Year order by Date desc)