【问题标题】:Count number of matching data in columns on the basis of primary key in two tables根据两个表的主键统计列中匹配数据的个数
【发布时间】:2014-09-18 05:01:45
【问题描述】:

我有两个结构相同的表和一些相同的数据。例如,让我们考虑以下表格。

表优先

id | name   | dept | rollno
1  | Mark   | A    | 4
2  | Michael| B    | 5
3  | Norman | C    | 6
4  | Paul   | D    | 7
5  | Robert | E    | 8

表秒

id | name   | dept | rollno
1  | Mark   | A    | 4
2  | Michael| B    | 5
3  | Norman | G    | 7
4  | Paul   | D    | 8
5  | Bradley| F    | 9

现在,在使两个表之间的“id”相等时,我想计算各种列匹配(名称/部门/rollno),即具有 0 列匹配的行,具有 1 列匹配的行,具有 2 列匹配的行和相同的记录(具有所有匹配的行)。

例如,给定数据的结果可以显示为

column_matches| count
0             | 1
1             | 1
2             | 1
3             | 2

我在 Oracle10g 上。有关如何解决此问题的任何想法都会非常有帮助。

【问题讨论】:

    标签: sql plsql


    【解决方案1】:

    如果不测试这个查询,这应该会有所帮助,我希望:

    SELECT ccols, COUNT(*)
      FROM(
           SELECT CASE WHEN p.name = s.name THEN 1 ELSE 0 END +
                  CASE WHEN p.dept = s.dept THEN 1 ELSE 0 END +
                  CASE WHEN p.roolno = s.rollno THEN 1 ELSE 0 END ccols
             FROM prim p
             JOIN sec  s
               ON p.id = s.id
          )
     GROUP
        BY ccols;
    

    【讨论】:

    • 完美运行!非常感谢。
    【解决方案2】:

    @DirkNM 您提供的解决方案确实非常适合@Ankur 所面临的具体情况。

    但是,更通用的方法是使用过程。

    这是比较两个表数据(具有完全相同的结构)的通用过程的脚本。

    /*
    Author: Kasim Husaini
    Creation Data: 18th Sept 2014
    Description: Procedure to compare two tables and giving matching column count as a result set.
    */
    Create PROCEDURE USP_COMPARE_TABLES(@P_PRI_TABLE VARCHAR(255)
        , @P_SEC_TABLE VARCHAR(255)
        , @P_PRIMARY_COL VARCHAR(255)
        ) AS
        BEGIN
            Declare @M_SQL VARCHAR(MAX)='';
            Declare @M_COL_COMPARE VARCHAR(MAX)='';
            Declare @M_SUB_QUERY VARCHAR(MAX)='';
            Declare @M_COMPARE_TEMPLATE VARCHAR(1000);
            Set @M_SQL='SELECT COL_COUNT, COUNT(1) MATCHES FROM ($X$) A GROUP BY COL_COUNT';
    
            SET @M_COMPARE_TEMPLATE = ' CASE WHEN P.$T$ = S.$T$ THEN 1 ELSE 0 END $N$';
    
            Select @M_COL_COMPARE=REPLACE(STUFF((Select '+'+REPLACE(@M_COMPARE_TEMPLATE,'$T$',C.NAME) FROM SYS.COLUMNS C 
            WHERE C.OBJECT_ID=OBJECT_ID(@P_PRI_TABLE) Order BY C.NAME FOR Xml Path('')),1,1,'')
            ,'$N$',CHAR(13))
    
            SET @M_SUB_QUERY = 'SELECT (' + @M_COL_COMPARE + ') AS COL_COUNT FROM ' + @P_PRI_TABLE + ' P JOIN ' + @P_SEC_TABLE +' S ON P.$PC$=S.$PC$ ';
    
            SET @M_SUB_QUERY=REPLACE(@M_SUB_QUERY,'$PC$',@P_PRIMARY_COL);
    
            SET @M_SQL=REPLACE(@M_SQL,'$X$',@M_SUB_QUERY);
            PRINT @M_SQL;
            Exec(@M_SQL);
        END
    

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2016-08-05
      • 2020-08-12
      相关资源
      最近更新 更多