【问题标题】:Compare multiple column data in two databases比较两个数据库中的多列数据
【发布时间】:2017-03-08 13:24:18
【问题描述】:

我有两个相同的数据库,一大堆数据从 1 转移到另一个,无论出于何种原因,似乎都没有指示哪个是迁移记录的标志。

我试图做的是比较每个数据库中的多个字段以查看迁移了哪些记录。

例如,DB1 的作业表中可能有 10,000 个作业,而 DB2(旧的)有 2,000 个。我知道这 2,000 个工作被计入 DB1 的 10,000 个工作中,但是如果不比较多个列,我无法区分这两者,直到我得到正确的数字。

我尝试了以下方法,但失败得很惨,结果为 0:

SELECT COUNT(*) FROm Job j
FULL OUTER JOIN [DB2.dbo.job jc ON CAST(j.jobID AS NVARCHAR(20)) = jc.jobTitle
WHERE j.AMID = jc.amid
    AND j.ClientID = jc.clientID
    AND j.personID = jc.ClientID
    AND j.JobReceivedDate = jc.JobReceivedDate
    AND j.JobTitle = jc.JobTitle

对此的任何帮助将不胜感激。

-- 编辑 ----------------------------------------- ------------------

以下代码导致返回超过 300 万行:

SELECT 
  d1.JobTitle, d1.AMID, d1.CLIENTID, d1.PersonID,
  d2.JobTitle, d2.AMID, d2.CLIENTID, d2.PersonID,
  [RESULT] = CASE 
    WHEN (d1.AMID = d2.AMID OR (d1.AMID IS NULL AND d2.AMID IS NULL))
     AND (d1.CLIENTID = d2.CLIENTID OR (d1.CLIENTID IS NULL AND d2.CLIENTID IS NULL))
     AND (d1.PersonID = d2.PersonID OR (d1.PersonID IS NULL AND d2.PersonID IS NULL))
    THEN 1 ELSE 0 END
FROM  [db1].dbo.Job AS d1
FULL OUTER JOIN
 [db2].dbo.Job AS d2
    ON D1.JobTitle = D2.JobTitle

此表中只有 84,000 条记录。

-- 编辑 ----------------------------------------- --------------------

将我的初始查询更改为以下效果很好:

SELECT DISTINCT j.jobID, jc.jobID, jc.JobTitle, j.JobTitle FROM Job j
FULL OUTER JOIN [Gulf-Jobs].dbo.job jc ON j.JobTitle = jc.JobTitle
WHERE j.JobTitle = jc.JobTitle
    AND j.ClientID          = jc.clientID
    AND j.personID          = jc.personID
    AND j.JobReceivedDate   = jc.JobReceivedDate
    AND j.JobTitle          = jc.JobTitle
    AND j.JobUpdatedDate    = jc.JobUpdatedDate
    AND j.JobTypeID         = jc.JobTypeID
    AND j.JobStatusID       = jc.JobStatusID
ORDER BY Jc.JobID

【问题讨论】:

  • 点击此链接:stackoverflow.com/questions/14441579/…。希望有帮助。
  • select count(*) from Job j inner join DB2.dbo.job jc on j.AMID = jc.amid AND j.ClientID = jc.clientID AND j.personID = jc.ClientID AND j.JobReceivedDate = jc.JobReceivedDate AND j.JobTitle = jc.JobTitle 试试这个
  • 感谢 vanloc,每当我尝试运行建议的脚本时,它给了我 300 万行,表中总共只有 84,000 行
  • @OwainEsau 在你加入的第一个代码块上 (j.jobID AS NVARCHAR(20)) = jc.jobTitle 这就是为什么你得到 0 作为计数,但是你在第二个块中加入了 jobtitle的代码。如果没有,您的第一个代码按预期工作,如果任何数据为空,请为每一列使用 inull(column,'')

标签: sql-server tsql


【解决方案1】:

评论中的答案

在你加入的第一个代码块中 (j.jobID AS NVARCHAR(20)) = jc.jobTitle 这就是为什么你得到 0 作为计数,但是你在第二个代码块中加入了 jobtitle。如果没有,您的第一个代码将按预期工作,如果任何数据为空,请为每一列使用 inull(column,'')

所以查询将是

SELECT COUNT(*) FROm Job j
FULL OUTER JOIN [DB2.dbo.job jc ON j.jobTitle = jc.jobTitle
WHERE j.AMID = jc.amid
AND j.ClientID = jc.clientID
AND j.personID = jc.ClientID
AND j.JobReceivedDate = jc.JobReceivedDate

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2011-05-29
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多