2011-02-18 39 views
3

我有2個表所示:選擇和從2代表的SQL Server中插入的更優雅的方式

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


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

我想從表1一個@table 2結果插入,並從表2 3分的結果,不同的ID,目前,我有這樣的:

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 
+0

使用`table1,table2,table3,.....`舊樣式的JOIN語法,如果你不注意的話,你一定會擁有笛卡爾產品!我建議總是使用新的,標準化的ANSI JOIN語法代替:`INNER JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN`等等 – 2011-02-18 05:49:06

回答

4

如果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) 
+2

嘿,那不公平!我打算髮佈一個只比OP稍微優雅的解決方案。事後應該發佈你的所有消息! :) +1 – 2011-02-18 09:18:12

1

我不知道,如果是更優雅,但在這裏,做同樣的一個不同的查詢。

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運算符來執行此操作。