SQL Получить значения из других таблиц перед командой Вставить в запрос - PullRequest
0 голосов
/ 10 мая 2018

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

Пример:

Table1

ID   |name   |nameID |network |...
----------------------------------
5    |Bob    |4      |NPOW    |...
6    |Billy  |8      |BGER    |...

Table2

ID   |name   |nameID |network |...
----------------------------------
3    |Stan   |2      |ERFDT   |...

Table3

ID   |name   |nameID |network |...
----------------------------------
3    |Steve  |3      |FRVS    |...

Table4 (таблица, в которую я вставляю новые строки ниже)

ID   |name   |nameID |network |...
----------------------------------

На моей странице это новые значения, которые мне нужно добавить в table4 выше:

Name   |ID |network |...
------------------------
Nick   |4  |RFGH    |...
Tony   |3  |ESLO    |...
James  |2  |HUII    |...
Rusty  |3  |ERNM    |...

Теперь я хочу посмотреть, какой столбец ID равен X и поместить это имя в Table4 .

Таким образом, результат для table4 должен выглядеть следующим образом после вставки :

ID   |name   |nameFromID |network |...
--------------------------------------
1    |Nick   |Bob        |RFGH    |...
2    |Tony   |Steve      |ESLO    |...
3    |James  |Stan       |HUII    |...
4    |Rusty  |Steve      |ERNM    |...

Так что же будет INSERT INTO Table4 query похоже для этого?

Ответы [ 3 ]

0 голосов
/ 10 мая 2018
CREATE TABLE #Temp0
(
    ID INT,
    [Name] VARCHAR(100),
    NameId INT,
    Network VARCHAR(100)
);

INSERT INTO #Temp0
(
    ID,
    Name,
    NameId,
    Network
)
VALUES
(5, 'Bob', 4, 'NPOW'),
(6, 'Billy', 8, 'BGER');

CREATE TABLE #Temp1
(
    ID INT,
    [Name] VARCHAR(100),
    NameId INT,
    Network VARCHAR(100)
);
INSERT INTO #Temp1
(
    ID,
    Name,
    NameId,
    Network
)
VALUES
(3, 'Stan', 2, 'ERFDT');
CREATE TABLE #Temp2
(
    ID INT,
    [Name] VARCHAR(100),
    NameId INT,
    Network VARCHAR(100)
);
INSERT INTO #Temp2
(
    ID,
    Name,
    NameId,
    Network
)
VALUES
(3, 'Steve', 3, 'FRVS');
SELECT *
INTO #Temp
FROM
(
    SELECT [Name],
           NameId
    FROM #Temp0
    UNION
    SELECT [Name],
           NameId
    FROM #Temp1
    UNION
    SELECT [Name],
           NameId
    FROM #Temp2
) AS Temp;



CREATE TABLE #Temp3
(
    [Name] VARCHAR(100),
    Id INT,
    Network VARCHAR(100)
);

INSERT INTO #Temp3
(
    Name,
    Id,
    Network
)
VALUES
('Nick', 4, 'RFGH'),
('Tony', 3, 'ESLO'),
('James', 2, 'HUII'),
('RUSTY', 3, 'ERNM');


CREATE TABLE #Table4
(
    ID INT IDENTITY(1, 1),
    [Name] VARCHAR(100),
    NameFormId VARCHAR(100),
    Network VARCHAR(100)
);

INSERT INTO #Table4
SELECT T2.Name,
       T1.Name,
       T2.Network
FROM #Temp T1
    JOIN #Temp3 T2
        ON T1.NameId = T2.Id;

SELECT *
FROM #Table4;

enter image description here

0 голосов
/ 10 мая 2018

Следующий код демонстрирует, как сопоставить данные на NameId между таблицами.Предполагается, что добавляемые Name являются уникальными.Если между входными таблицами есть несколько совпадений NameId, предпочтение отдается наиболее раннему совпадению.Несколько NameId совпадений в одной входной таблице отдают предпочтение самым низким Id.

-- Sample data.
declare @Table1 as Table ( Id Int, Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @Table1 ( Id, Name, NameId, Network ) values
  ( 5, 'Bob', 4, 'NPOW' ), ( 6, 'Billy', 8, 'BGER' );
select * from @Table1;

declare @Table2 as Table ( Id Int, Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @Table2( Id, Name, NameId, Network ) values
  ( 3, 'Stan', 2, 'ERFDT' );
select * from @Table2;

declare @Table3 as Table ( Id Int, Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @Table3 ( Id, Name, NameId, Network ) values
  ( 3, 'Steve', 3, 'FRVS' ),
  ( 4, 'Steven', 3, 'FRVS' ), -- Note duplicate   NameId   value.
  ( 9, 'Stanley', 2, 'VOOT' ); -- Note duplicate   NameId   value.
select * from @Table3;

declare @ValuesToAdd as Table ( Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @ValuesToAdd ( Name, NameId, Network ) values
  ( 'Nick', 4, 'RFGH' ), ( 'Tony', 3, 'ESLO' ),
  ( 'James', 2, 'HUII' ), ( 'Rusty', 3, 'ERNM' );
select * from @ValuesToAdd;

-- Process the data.
declare @Table4 as Table ( Id Int Identity, Name VarChar(10), NameId Int,
  NameFromId VarChar(10), Network VarChar(10) );
-- Demonstrate the matching.
select Name, NameId, NameFromId, Network
  from (
    select VTA.Name, VTA.NameId, N.Name as NameFromId, VTA.Network,
      Row_Number() over ( partition by VTA.Name order by NameRank, Id ) as RN
      from @ValuesToAdd as VTA inner join ( -- Use   left outer join   if there might not be a match on   NameId .
        select Id, Name, NameId, 1 as NameRank from @Table1 union all
        select Id, Name, NameId, 2 from @Table2 union all
        select Id, Name, NameId, 3 from @Table3 ) as N on N.NameId = VTA.NameId ) as PH
  --where RN = 1; -- Pick the match from the earliest table.
-- Insert the results.
insert into @Table4
  select Name, NameId, NameFromId, Network
    from (
      select VTA.Name, VTA.NameId, N.Name as NameFromId, VTA.Network,
        Row_Number() over ( partition by VTA.Name order by NameRank, Id ) as RN
        from @ValuesToAdd as VTA inner join ( -- Use   left outer join   if there might not be a match on   NameId .
          select Id, Name, NameId, 1 as NameRank from @Table1 union all
          select Id, Name, NameId, 2 from @Table2 union all
          select Id, Name, NameId, 3 from @Table3 ) as N on N.NameId = VTA.NameId ) as PH
    where RN = 1; -- Pick the match from the earliest table.
select * from @Table4;
0 голосов
/ 10 мая 2018

Это можно сделать с помощью представления, некоторых объединений, временной таблицы или другой промежуточной таблицы с областью видимости сеанса.Вот подход к временным таблицам.

Представление для объединения всех различных таблиц в одну форму с запросом:

CREATE VIEW vAllNames
AS
SELECT [Name], NameID FROM Table1 UNION
SELECT [Name], NameID FROM Table2 UNION
SELECT [Name], NameID FROM Table3

Выше предполагается, что NameId нельзя дублировать в этих таблицах, поэтомуЯ использовал UNION вместо UNION ALL.В противном случае вам нужно будет сообщить нам, как вы хотите разрешить имя, если идентификатор успешно совпадает с несколькими таблицами.Вы хотите, чтобы в таблицу 4 было вставлено несколько записей, только первое совпадение, какая-то конкатенация и т. Д.

Временная таблица, поэтому у нас есть что выбрать для вставки, если вы не хотите вставлять по одной за раз(вы также можете сделать это с помощью постоянной таблицы сессий или чего-то в этом роде):

CREATE TABLE #TempDataToInsert
(
    [Name] NVARCHAR(256),
    ID INT,
    network CHAR(4)
)

Создав их, вы можете вставить данные со своей страницы прямо в TempDataToInsert.После того, как ваши данные размещены там, вы можете запустить финальную insert into:

INSERT INTO Table4
    ([Name], nameFromID, network) -- Assumes ID is an identity column
SELECT
    tempData.[Name], allNames.[Name], tempData.network
FROM
    #TempDataToInsert tempData
    LEFT OUTER JOIN vAllNames allNames ON tempData.ID = allNames.NameID -- assumes no match is still valid for insertions

После этого вам нужно будет очистить временную таблицу, и я сделал некоторые предположения о вашей схеме, но это должно указать вамв правильном направлении.

...