我有两个表Names和Name_ids,如下所示.
平台:SQL Server 2005/2008.
Names table:
Nam ID
-------------------------------- -----------
A 1
B 2
C 3
D 4
E 5
F 6
G 7
H 8
Run Code Online (Sandbox Code Playgroud)
和
name_ids table
ID
-----------
3
6
8
Run Code Online (Sandbox Code Playgroud)
我想生成以下输出连接这些表.
Nam Nam_ID ID
-------------------------------- ----------- -----------
A 1 NULL
B 2 NULL
C 3 3
D 4 3
E 5 3
F 6 6
G 7 6
H 8 8
Run Code Online (Sandbox Code Playgroud)
逻辑是将nam_id与id匹配,如果nam_id小于任何id,则返回NULL.如果nam_id大于或等于id,则返回id.这是捕获.在上面的例子中,对于F,6我们不应该返回F,6,3组合,但我们应该只返回匹配的F,6,6.当匹配项找到像6,6时,它应该跳过其他匹配,如6,3.之后使用7,6而不是7,3.如何编写上面的SQL查询?查询是时间密集的,需要快速执行.
Scripts:
Create table Names(Nam nvarchar(32), ID int);
insert into names values('A', 1);
insert into names values('B', 2);
insert into names values('C', 3);
insert into names values('D', 4);
insert into names values('E', 5);
insert into names values('F', 6);
insert into names values('G', 7);
insert into names values('H', 8);
Create table name_ids( ID int);
insert into name_ids values(3);
insert into name_ids values(6);
insert into name_ids values(8);
Run Code Online (Sandbox Code Playgroud)
请帮忙.
更新:嘿伙计们,非常感谢您提供解决方案的努力.现在我很困惑,选择性能最佳的查询.我已经选择了很少并试图用非常大的结果集来分析性能.
select n.Nam,
CASE WHEN ni.ID IS NULL THEN (SELECT MAX(ID) from name_ids n1 where
n1.ID < n.ID)
ELSE ni.ID
END
from Names n
left join name_ids ni on n.ID = ni.ID
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |