Более элегантный способ выбора и вставки из 2-х таблиц SQL Server - PullRequest
3 голосов
/ 18 февраля 2011

У меня есть 2 таблицы, такие как:

ID NAME
-------------
1  someValue
2  someValue
3  someValue
4  someValue
...


ID NAME
-------------
1  var
2  var2
3  var3
4  var4
...

Я хочу вставить в @table 2 результаты из таблицы1 и 3 результата из таблицы2 с другим идентификатором. В настоящее время у меня есть что-то вроде:

Declare @vars TABLE(
        field1  varchar(80),
        field2  varchar(80),
        field3  varchar(80),
        field4  varchar(80),
        field5  varchar(80)
    )

INSERT INTO @vars(field1, field2, field3, field4, field5)
    SELECT  a.Name,
            b.Name,
            c.Name,
            d.Name,
            e.Name
    FROM    @Table1  a,
            @Table1  b, 
            @Table2  c,
            @Table2  d,
            @Table2  e
    WHERE   a.ID = 1 
    AND     b.ID = 25
    AND     c.ID = 12 
    AND     d.ID = 25 
    AND     e.ID = 14 

Я получаю ожидаемые значения, но ...

  • Есть ли более элегантный способ сделать этот? Я думаю, я делаю больше, чем необходимо.

P.D. Я получаю что-то вроде:

field1  field2 field3 field4 field5
-------------------------------------
val1     var2    val4   val7   var7

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Если ID является первичным ключом или уникальным ключом в Таблицах 1 и 2, вы можете сделать это вместо этого.

insert into @vars
select
  (select Name from @Table1 where ID = 1),
  (select Name from @Table1 where ID = 25),
  (select Name from @Table2 where ID = 12),
  (select Name from @Table2 where ID = 25),
  (select Name from @Table2 where ID = 14)
1 голос
/ 18 февраля 2011

Я не уверен, что это более элегантно, но вот другой запрос, который делает то же самое.

WITH myTables AS
    ( SELECT ID, NAME, 'Table1' AS SOURCE
    FROM Table1

    UNION ALL

    SELECT ID, NAME, 'Table2' AS SOURCE
    FROM Table2
    )
INSERT INTO @vars(field1, field2, field3, field4, field5)
SELECT MAX(CASE WHEN source = 'Table1' AND id = 1  THEN NAME END) AS field1,
    MAX(CASE    WHEN source = 'Table1' AND id = 25 THEN NAME END) AS field2,
    MAX(CASE    WHEN source = 'Table2' AND id = 12 THEN NAME END) AS field3,
    MAX(CASE    WHEN source = 'Table2' AND id = 25 THEN NAME END) AS field4,
    MAX(CASE    WHEN source = 'Table2' AND id = 14 THEN NAME END) AS field5
FROM myTables
WHERE SOURCE = ('Table1'  AND ID IN (1, 25))
    OR (SOURCE = 'Table2' AND ID IN (12, 25, 14)) ;

Он использует общее табличное выражение (CTE) для создания объединения двух таблиц. Он также поворачивает данные с помощью агрегации MAX. Вы также можете сделать это с оператором PIVOT.

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