比较两个表,并在第二个表中添加结果

问题描述:

我一直在比较两个几乎相同的表,并在第二个表中更新/添加结果。这里是我使用的两张桌子。 Person1(ID,姓名,PHNumber)和Person2(ID,姓名,PHNumber,IsActive)。比较两个表,并在第二个表中添加结果

注意: person1总是比person2少/相同的行.Person1是参考表,我们需要添加/删除person1 int中存在/不存在的行。 我正在使用Microsoft SQL Server管理工作室。

案例1:如果比较的结果有更多的行(让我们说PERSON1有10家,PERSON2具有8rows),那么我们需要添加这些(2rows)到PERSON2并保持IsActive-1的行。

案例2:如果比较结果有差异(比如说person1有10个,但是person2有20个),那么我们需要找到这些delta 10rows并为这10个行保留IsActive-0。

希望这个查询很清晰,并期待您的宝贵解决方案。谢谢。

Here Person1 does not contain newdata2 and contains newdata,newdata1 which are 
 
new values after comparing, so we are giving IsActive-0 and IsActive-1 
 
respectively. 
 
Person1: 
 
    ID  Name  PHNumber 
 
1 \t missouri  123 
 
2 \t kansas  111 
 
3 \t stlouise  234 
 
4 \t california 456 
 
5 \t india  888 
 
6 \t srilanka  780 
 
7 \t dallas  890 
 
8 \t texas  1111 
 
9 \t mario  1112 
 
10 \t sister  7878 
 
11 \t pontiac  8765 
 
12 \t newdata \t  1234 
 
13 \t newdata1  2345 
 

 
Person2: 
 
ID  Name  PHNumber IsActive 
 
1 \t missouri  123  1 
 
2 \t kansas  111  1 
 
3 \t stlouise  234  1 
 
4 \t california 456  1 
 
5 \t india  888  1 
 
6 \t srilanka  780  1 
 
7 \t dallas  890  1 
 
8 \t texas  1111  1 
 
9 \t mario  1112  1 
 
10 \t sister  7878  1 
 
11 \t pontiac  8765  1 
 
12  newdata2  987  1 
 

 
RESULT: Person2: 
 
ID  Name  PHNumber IsActive 
 
1 \t missouri  123  1 
 
2 \t kansas  111  1 
 
3 \t stlouise  234  1 
 
4 \t california 456  1 
 
5 \t india  888  1 
 
6 \t srilanka  780  1 
 
7 \t dallas  890  1 
 
8 \t texas  1111  1 
 
9 \t mario  1112  1 
 
10 \t sister  7878  1 
 
11 \t pontiac  8765  1 
 
12  newdata2  987  0 
 
13  newdata \t  1234  1 
 
14 \t newdata1  2345  1

+0

哪个匹配列(其中列中的值是相同的)使行“平等“到另一排? – granadaCoder

+0

这很简单。请尝试使用合并/更新声明并返回给我们。 https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx –

+0

MySQL或SQL服务器?你们都有标签......你的意思是? – pmbAustin

如果你还在寻找或答案,你可以尝试这样的...

;WITH cte 
AS (SELECT 
    COALESCE(p1.id, p2.id) AS id, 
    COALESCE(p1.name, p2.name) AS name, 
    COALESCE(p1.phnumber, p2.phnumber) AS phnumber, 
    CASE WHEN p1.name IS NULL THEN 0 ELSE 1 END AS IsActive 
FROM Person1 p1 
FULL JOIN person2 p2 
    ON p1.name = p2.name 
    AND p1.phnumber = p2.phnumber) 
SELECT 
    ROW_NUMBER() OVER (ORDER BY id, phnumber) AS id, 
    name, phnumber, IsActive 
FROM cte 
+0

谢谢Kannan Kndasamy,你的解决方案给了我正确的结果,但我需要在所有情况下进行测试。谢谢你花费你宝贵的时间给我.. – Virat

+0

欢迎你... –