2011-02-18 38 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运算符来执行此操作。