Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 比较两个sql表中不匹配的数据_Sql Server_Excel - Fatal编程技术网

Sql server 比较两个sql表中不匹配的数据

Sql server 比较两个sql表中不匹配的数据,sql-server,excel,Sql Server,Excel,我有一个sql表格Company1,其中包含companyname、personname、mobile、cardno字段(从excel文件导入),还有一个表格Company2,其中包含更多字段,包括与上述字段相同的字段(从表单中添加) 我想检查一个特定的公司,每个表中有多少行缺失,有多少不匹配。与company2中不在company1中的任何行一样,如果存在personname、mobileno和cardno,则为特定行的匹配行 例如。 如果公司1有row Peter,9412686,10239

我有一个sql表格Company1,其中包含companyname、personname、mobile、cardno字段(从excel文件导入),还有一个表格Company2,其中包含更多字段,包括与上述字段相同的字段(从表单中添加)

我想检查一个特定的公司,每个表中有多少行缺失,有多少不匹配。与company2中不在company1中的任何行一样,如果存在personname、mobileno和cardno,则为特定行的匹配行

例如。 如果公司1有row

Peter,9412686,10239897
而公司2已经

Peter,9000000, 10239897

手机号码不匹配。我想显示不匹配的行以进行更正。sql查询是否可行。

您可以尝试执行从
Company2
Company1
左联接,联接条件是所有4个(或更多)列都匹配。然后,当
Company2
中的记录与
Company1
中的记录不完全匹配时,就会发生不匹配

SELECT c2.*
FROM Company2 c2
LEFT JOIN Company1 c1
    ON c2.companyname = c1.companyname AND
       c2.personname  = c1.personname  AND
       c2.mobile      = c1.mobile      AND
       c2.cardno      = c1.cardno
WHERE c1.companyname IS NULL

这假设
Company2
是关于为给定公司工作的员工条目的主表。如果一个雇员记录可以出现在一个表中,而不是两个表中,那么您应该考虑使用一个完整的外部连接来代替。

这对您有用吗?在当前版本的查询中,移动不匹配覆盖了cardno不匹配,但添加这一点也不难

SELECT
    ISNULL(C1.personname,C2.personname) personname,
CASE 
    WHEN C1.personname IS NULL THEN 'Missing in Company 1 table' 
    WHEN C2.personname IS NULL THEN 'Missing in Company 2 table' 
    WHEN (C1.mobile <> C2.mobile) THEN 'Mobile mismatch'
    WHEN (C1.cardno <> C2.cardno) THEN 'Cardno mismatch'
    ELSE NULL
END AS 'Comment' 
FROM 
Company1 C1
FULL OUTER JOIN
Company2 C2 ON C1.personname = C2.personname
选择
ISNULL(C1.personname,C2.personname)personname,
案例
当C1.personname为空时,则“在公司1表中丢失”
当C2.personname为空时,则“在公司2表中缺失”
当(C1.移动C2.移动)时,则“移动不匹配”
当(C1.cardno C2.cardno)时,则“cardno不匹配”
否则无效
以“评论”结尾
从…起
公司1 C1
完全外接
C1上的公司2 C2.personname=C2.personname

如果OP想知道行中值不匹配的列的确切列名,上述查询是否有效?@Coder1991不,不会,但OP没有明确要求。您正在考虑的可能需要动态SQL。我的答案至少是标记不匹配。是的。我只是好奇地想知道。除了动态sql,我的假设是,如果OP需要知道确切的列名,合并操作还将让OP知道不匹配的值(output.deleted)。然而,我希望这将是一个代价高昂的操作。@Coder1991我希望不匹配记录的数量很少,并且数据中的缺陷相对较少,因此可以进行手动检查。上面的查询是否显示了所有不匹配或匹配的记录。请注意,从excel导入的Company 1表是最新的,我需要对照第一个表检查Company2数据。假设company1表仅包含该公司的所有记录,则Company name列是否冗余?