根据SQL Server中的两列查找匹配记录

时间:2017-03-01 22:42:04

标签: sql sql-server

我有两张如下表:

Table A (SSN, Date)
1234 01/01/2016,
4567 12/10/2016,
1233 10/09/2016,
2344 11/10/2016,
5765 06/05/2016,
5657 09/25/2016,
3434 03/12/2016,
8768 01/20/2017,
4353 05/29/2017,
6878 07/30/2017,
3242 03/01/2017,
3467 01/11/2017,

Table B (SSN, Date)
1234 01/01/2016,
4567 12/10/2016,
1233 10/09/2016,
2344 10/09/2016,
2344 10/09/2016,
5765 08/12/2016,
5657 11/30/2016,
3434 03/12/2016,
8768 01/20/2017,
4353 05/29/2017,
6878 07/30/2017,
3242 03/01/2017,
3467 01/11/2017,
1233 02/01/2016,
1233 12/09/2017,
3434 12/11/2016,
3434 01/01/2016

SSN和日期列只是众多列中的两列,我需要将表A视为基本列,因为我需要根据以下条件提取该SSN的整个记录​​。 我想将表A中的SSN和Date列与表B进行比较。

  • 保留表A和表B中的匹配SSN和日期。
  • 如果未找到匹配记录,则保留表A中该SSN的日期值,并从表B中搜索该SSN的最小值(日期),并从表B中搜索最大值(日期)。

到目前为止,我有这个查询,但遇到了障碍,听起来像基于两列的Excel中的Vlookup类似。任何帮助将非常感激。

在此查询中,截至目前我只是尝试获取True或False值,如果匹配且不匹配,则需要合并上述条件。

select s.SSN, S.Date,
   (case when ns.Date is null then 'False' else 'TRUE' end)

   from TableA s 
   left outer join 
   (select SSN, Date from TableB ) ns

on s.(SSN) = ns.SSN 
   and s.PPED = ns.Date

1 个答案:

答案 0 :(得分:1)

如果我理解正确,最简单的方法就是使用一些子查询。

SELECT
    a.SSN
,   a.Date
,   CASE WHEN b.Date IS NULL THEN (SELECT MAX(Date) FROM TableB x WHERE a.SSN = x.SSN) END  AS MinDate
,   CASE WHEN b.Date IS NULL THEN (SELECT MIN(Date) FROM TableB x WHERE a.SSN = x.SSN) END  AS MaxDate
FROM TableA a
    LEFT JOIN TableB b
        ON  a.SSN = b.SSN
        AND a.Date = b.Date

当TableB与TableA中的确切日期不匹配时,它将显示TableB的最小和最大日期。

希望它至少足以让你入门。另一种选择是改为对MIN / MAX子查询进行一些连接。

SELECT
    a.SSN
,   a.Date
,   CASE WHEN b.Date IS NULL THEN MinDate END   AS MinDate
,   CASE WHEN b.Date IS NULL THEN MaxDate END   AS MaxDate
FROM TableA a
    LEFT JOIN TableB b
        ON  a.SSN = b.SSN
        AND a.Date = b.Date
    LEFT JOIN (
        SELECT SSN, MIN(Date) AS MinDate
        FROM TableB
        GROUP BY SSN
    ) mn
        ON a.SSN = mn.SSN
    LEFT JOIN (
        SELECT SSN, MAX(Date) AS MaxDate
        FROM TableB
        GROUP BY SSN
    ) mx
        ON a.SSN = mx.SSN

我不知道什么对您来说更具可读性。可能还有很多方法可以做到这一点。