我是SQL Server的新手,也是学习阶段的新手。我想执行以下任务。
我有两个表Table1和Table2。我想循环Table1的行来检查值是否与Table2的任何行匹配。
表1:
ID Name Nationality DOB Priority
--------------------------------------------
1 Sujan Nepali 1996 NULL
2 Sujan Nepali 1999 NULL
3 Sujan Chinese 1996 NULL
4 Sujan Chinese 1888 NULL
表2:
ID Name Nationality DOB Address Rank
---------------------------------------------------
1 Sujan Nepali 1996 Kathmandu 1
在表1中,ID 1与表2中相同列名的所有值匹配。我需要将其优先级更新为1。
在ID 2中,DOB不同,名称和国籍匹配,因此将优先级更新为2。
在ID 3中,Name和Year与Table2相同,因此将优先级更新为3。
在ID 4中,只有名称相同,因此将优先级更新为4。
预期产出:
表1:
ID Name Nationality DOB Priority
---------------------------------------------
1 Sujan Nepali 1996 1
2 Sujan Nepali 1999 2
3 Sujan Chinese 1996 3
4 Sujan Chinese 1888 4
我使用CASE但需要使用IF ELSE IF条件执行。任何帮助将不胜感激。
答案 0 :(得分:0)
我想你需要这样的东西。交叉连接两个表并查找彼此匹配的列。根据那个更新。
declare @table1 table (ID int, Name varchar(100), Nationality varchar(100), DOB int, Priority int)
insert into @table1
values
(1, 'Sujan', 'Nepali', 1996, NULL)
, (2, 'Sujan', 'Nepali', 1999, NULL)
, (3, 'Sujan', 'Chinese', 1996, NULL)
, (4, 'Sujan', 'Chinese', 1888, NULL)
declare @table2 table (ID int, Name varchar(100), Nationality varchar(100), DOB int, Address varchar(100), Rank int)
insert into @table2 values (1, 'Sujan', 'Nepali', 1996, 'Kathmandu', 1)
;with cte as (
select
a.*, rnk = row_number() over (order by case when a.Name = b.Name then 100 else 0 end
+ case when a.Nationality = b.Nationality then 10 else 0 end
+ case when a.DOB = b.DOB then 1 else 0 end desc)
from
@table1 a
join @table2 b on a.Name = b.Name
)
update cte
set priority = rnk
select * from @table1
答案 1 :(得分:0)
除非这是作业,否则我认为没有理由使用if
构造。
update table1 set priority = (
select min(case
when table2.id = table1.id and ... then 1
when ... then 2
when ... then 3
...
end
from table2
)
确保分支按优先顺序排列。