SQL для объединения столбцов для двух таблиц с одинаковым количеством строк - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть две таблицы, которые я хочу объединить.Каждый из них содержит одинаковое количество строк, и я хочу, чтобы в моем результате было одинаковое количество строк, но столбцы из обоих.Неважно, какая строка из таблицы A соответствует какой строке из таблицы B. Причина этого в том, что я пишу запрос, который свяжет строки, поэтому в настоящий момент между ними нет никакой связи.

Мой текущий подход (SQL ниже) состоит в том, чтобы выбрать данные из каждой таблицы с номером строки, а затем объединить таблицы на основе этого номера строки.Это дает желаемый результат, но есть ли более простой способ сделать это?

SELECT IdA, IdB
FROM (
    SELECT IdA, ROW_NUMBER() OVER(ORDER BY IdA) RowNum 
    FROM TableA
) a
JOIN (
    SELECT IdB, ROW_NUMBER() OVER(ORDER BY IdB) RowNum 
    FROM TableB
) b
ON a.RowNum = b.RowNum;

1 Ответ

1 голос
/ 23 сентября 2019

Я нашел пример (возможное решение) здесь и извлек решение для простой справки:

CREATE TABLE #Temp_One (
    [RowNum] [int] IDENTITY (1, 1) NOT NULL ,
    [Description] [nvarchar] (50) NOT NULL
)

CREATE TABLE #Temp_Two (
    [RowNum] [int] IDENTITY (1, 1) NOT NULL ,
    [Description] [nvarchar] (50) NOT NULL
)

INSERT INTO #Temp_One
SELECT Your_Column FROM Your_Table_One ORDER BY Whatever

INSERT INTO #Temp_Two
SELECT Your_Column FROM Your_Table_Two ORDER BY Whatever

SELECT * 
FROM #Temp_One a 
    LEFT OUTER JOIN #Temp_Two b 
         On a.RowNum = b.RowNum

Чтобы не повторять себя, пишя его снова и снова, выможет создать STORED PROCEDURE или VIEW и вызывать его каждый раз, когда вам нужно из стороннего приложения.Таким образом, вы убедитесь, что соблюдаете концепцию DRY:

  CREATE STORED PROCEDURE MyProc
    AS
    BEGIN
    --you could insert a TRY CATCH block -- not mandatory
        CREATE TABLE #Temp_One (
        [RowNum] [int] IDENTITY (1, 1) NOT NULL ,
        [Description] [nvarchar] (50) NOT NULL
        )

        CREATE TABLE #Temp_Two (
        [RowNum] [int] IDENTITY (1, 1) NOT NULL ,
        [Description] [nvarchar] (50) NOT NULL
        )

        INSERT INTO #Temp_One
        SELECT Your_Column FROM Your_Table_One ORDER BY Whatever

        INSERT INTO #Temp_Two
        SELECT Your_Column FROM Your_Table_Two ORDER BY Whatever

        SELECT * 
        FROM #Temp_One a 
        LEFT OUTER JOIN #Temp_Two b 
             On a.RowNum = b.RowNum
    END
    GO

ИЛИ

CREATE VIEW MyView
AS

SELECT ....

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