在SQL中加入条件

时间:2018-02-12 09:50:03

标签: sql sql-server

我想加入包含以下内容的表:激进,符号,日期和年份。有时表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;

2 个答案:

答案 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)