Вложенный цикл while в SQL Server не показывает ожидаемый результат - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь соединить записи из двух разных таблиц, чтобы я мог отобразить данные в табличном формате в табличном SSRS.

Код ниже не возвращает ожидаемых результатов.

Как есть, для каждого элемента в 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

Чего мне не хватает?

1 Ответ

2 голосов
/ 11 июня 2019

Вы, похоже, хотите cross join:

select a.*, c.*
from #Temp_A a cross join
     #Temp_C c
order by a.id, c.id;

Здесь - это скрипта db <>.

Нет необходимости писать WHILE цикл, чтобы сделать это.

Вы можете использовать insert, чтобы вставить это в #TempMain, но я не вижу необходимости иметь временную таблицу для хранения результатов этого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...