sql - SQL Server 中的嵌套 while 循环未显示预期结果
问题描述
我正在尝试连接来自两个不同表的记录,以便可以在 SSRS tablix 中以表格格式显示数据。
下面的代码不会返回预期的结果。
Temp_A
照原样,对于循环中的每个项目,都会使用Temp_C
. 这是代码:
CREATE TABLE #Temp_A
(
[ID] INT,
[Name] VARCHAR(255)
)
INSERT INTO #Temp_A ([ID], [Name])
VALUES (1, 'A'), (2, 'B')
CREATE TABLE #Temp_C
(
[ID] INT,
[Name] VARCHAR(255)
)
INSERT INTO #Temp_C ([ID], [Name])
VALUES (1, 'C'), (2, 'D')
CREATE TABLE #Temp_Main
(
[Temp_A_ID] INT,
[Temp_A_Name] VARCHAR(255),
[Temp_C_ID] INT,
[Temp_C_Name] VARCHAR(255),
)
DECLARE @MIN_AID int = (SELECT MIN(ID) FROM #Temp_A)
DECLARE @MAX_AID int = (SELECT MAX(ID) FROM #Temp_A)
DECLARE @MIN_DID int = (SELECT MIN(ID) FROM #Temp_C)
DECLARE @MAX_DID int = (SELECT MAX(ID) FROM #Temp_C)
WHILE @MIN_AID <= @MAX_AID
BEGIN
WHILE @MIN_DID <= @MAX_DID
BEGIN
INSERT INTO #Temp_Main([Temp_A_ID], [Temp_A_Name])
SELECT ID, [Name]
FROM #Temp_A
WHERE ID = @MIN_AID
UPDATE #Temp_Main
SET [Temp_C_ID] = ID, [Temp_C_Name] = [Name]
FROM #Temp_C
WHERE ID = @MIN_DID
SET @MIN_DID = @MIN_DID + 1
END
SET @MIN_AID = @MIN_AID + 1
SET @MIN_DID = 1
END
SELECT * FROM #Temp_Main
DROP TABLE #Temp_A
DROP TABLE #Temp_C
DROP TABLE #Temp_Main
结果不正确:
Temp_A_ID | Temp_A_Name | Temp_C_ID | Temp_C_Name
----------+-------------+-----------+---------------
1 A 2 D
1 A 2 D
2 B 2 D
2 B 2 D
预期成绩:
Temp_A_ID | Temp_A_Name | Temp_C_ID | Temp_C_Name
----------+-------------+-----------+---------------
1 A 1 C
1 A 2 D
2 B 1 C
2 B 2 D
我错过了什么?
解决方案
你似乎想要一个cross join
:
select a.*, c.*
from #Temp_A a cross join
#Temp_C c
order by a.id, c.id;
这是一个 db<>fiddle。
无需编写WHILE
循环来执行此操作。
您可以使用insert
将其插入到#TempMain
中,但我不需要有一个临时表来存储此查询的结果。
推荐阅读
- r - 在 R Studio 中运行时,RTools 版本 3.5 与 R 3.5 不兼容 - 有人遇到过这个问题吗?
- java - 如何让 MatchAllFilter 正常工作并将其他过滤器添加到 MatchAllfilter?
- tensorflow - 部署到 IBM Cloud 的问题
- delphi - 什么是 Delphi 的第一个版本,它允许像 double(10) 这样的类型转换
- javascript - 缓存不更新
- python - 将数字组合在一起形成多位数字
- angular - Angular 6 - 将数组属性转换为一组新数组
- python - Python:Numpy 将数组组合成 2x1 列表
- c# - 从 List 中读取数据
- emacs - web-mode:它可以在 JS 中的每一行包装注释上添加注释分隔符吗?