匹配两个数据库中的行组

时间:2017-02-23 16:55:13

标签: sql sql-server sql-server-2014

我在两个数据库中有以下(简化)情况:

    ID       Prog      T         Qt   
|---------|--------|---------|---------|  
|   a     |    1   |   N     |   100   |  
|   b     |    1   |   Y     |   10    |  
|   b     |    2   |   N     |   90    |  
|   c     |    1   |   N     |   25    |  
|   c     |    2   |   Y     |   25    |  
|   c     |    3   |   Y     |   25    |  
|   c     |    4   |   Y     |   25    |  
|---------|--------|---------|---------|  
    ID       Prog      T         Qt   
|---------|--------|---------|---------|  
|   1     |    1   |   Y     |   10    |  
|   1     |    2   |   N     |   90    |  
|   2     |    1   |   Y     |   100   |  
|   3     |    1   |   Y     |   100   |  
|   4     |    1   |   Y     |    50   |  
|   4     |    2   |   Y     |    25   |  
|   4     |    3   |   Y     |    25   |      
|---------|--------|---------|---------|  

我需要比较行组(主键是ID和Prog),以找出哪些行组代表相同的因子组合(不考虑ID)。

在上面的例子中,第一个表中的ID“b”和第二个表中的ID“1”具有相同的Prog,T和Qt值组合,而其他人之间没有其他人可以认为完全相同dbs(第二个表中的ID“2”和“3”相等,我对在同一个数据库中进行比较不感兴趣。)

我希望我解释了一切。

2 个答案:

答案 0 :(得分:3)

加入和聚合应该可以用于此目的:

select t1.id, t2.id
from (select t1.*, count(*) over (partition by id) as cnt
      from t1
     ) t1 join
     (select t2.*, count(*) over (partition by id) as cnt
      from t2
     ) t2
     on t1.prog = t2.prog and t1.T = t2.T and t1.Qt = t2.Qt and t1.cnt = t2.cnt
group by t1.id, t2.id, t1.cnt
having count(*) = t1.cnt;

这有点棘手。子查询计算每个表中每个id的行数。 on子句获得三列之间的匹配 - 并检查id是否具有相同的计数。 group byhaving然后获取匹配行数是总行数的行。

答案 1 :(得分:1)

在要匹配的条件上加入两个表。结果将是它们之间匹配的值。

CREATE TABLE a (ID CHAR(1), Prog INT, T CHAR(1), Qt INT);
CREATE TABLE b (ID int, Prog INT, T CHAR(1), Qt INT);

    INSERT INTO dbo.a
            ( ID ,Prog ,T ,Qt)
    VALUES  ('a',1,'N',100), ('b',1,'Y',10), ('b',2,'N',90),('c',1,'N',25),('c',2,'Y',25),('c',3,'Y',25),('c',4,'Y',25)
    INSERT INTO dbo.b
            ( ID ,Prog ,T ,Qt)
    VALUES  (1,1,'Y',10),(1,2,'N',90),(2,1,'Y',100),(3,1,'Y',100),(4,1,'Y',50),(4,2,'Y',25),(4,3,'Y',25)

WITH CTEa
AS (SELECT  ID,
            Prog,
            T,
            Qt,
            Cnt = COUNT(ID) OVER (PARTITION BY ID)
    FROM    dbo.a
   ),
     CTEb
AS (SELECT  ID,
            Prog,
            T,
            Qt,
            Cnt = COUNT(ID) OVER (PARTITION BY ID)
    FROM    dbo.b
   )
SELECT  ID_A = a.ID,
        ID_B = b.ID,
        b.Prog,
        b.T,
        b.Qt,
        b.Cnt
FROM    CTEa AS a
  INNER JOIN CTEb AS b
    ON a.Prog = b.Prog
       AND  a.T = b.T
       AND  a.Qt = b.Qt
       AND  a.Cnt = b.Cnt;

结果:

ID_A    ID_B    Prog    T   Qt  Cnt
b       1       1       Y   10  2
b       1       2       N   90  2