【问题标题】:compare two tables and add result in second table比较两个表并将结果添加到第二个表中
【发布时间】:2016-10-04 19:02:41
【问题描述】:

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

注意: person1 总是比 person2 有更多/更少/相同的行。Person1 是参考表,我们需要将 person1 int 中存在/不存在的行添加/删除到 person2。 我正在使用 Microsoft SQL Server Management Studio。

案例 1: 如果比较结果有更多行(假设 person1 有 10 行,person2 有 8 行),那么我们需要将这些(2 行)添加到 person2 并为这些行保留 IsActive-1。

案例2:如果比较结果有差异(假设 person1 有 10 行,而 person2 有 20 行),那么我们需要找到那些 delta 10 行并为这 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	missouri     123
2	kansas       111
3	stlouise     234
4	california   456
5	india        888
6	srilanka     780
7	dallas       890
8	texas        1111
9	mario        1112
10	sister       7878
11	pontiac      8765
12	newdata	     1234
13	newdata1     2345

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

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

【问题讨论】:

  • 哪些匹配列(列中的值相同)使一行“等于”另一行?
  • 这很容易。请尝试使用合并/更新语句并返回给我们。 technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx
  • MySQL 还是 SQL-Server?你们都标记了...你是什么意思?
  • @pmbAustin 对不起,我的意思是 sql-server,你能帮我解决这个问题吗?谢谢。

标签: sql-server


【解决方案1】:

如果你还在寻找或回答,可以这样尝试……

;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

【讨论】:

  • 谢谢 Kannan Kndasamy,您的解决方案给了我正确的结果,但我需要在所有情况下进行测试。感谢您为我花费宝贵的时间..
猜你喜欢
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多