从SQL Server中选择和插入两个表的更优雅的方法
我有两张桌子,像:从SQL Server中选择和插入两个表的更优雅的方法,sql,tsql,sql-server-2008,Sql,Tsql,Sql Server 2008,我有两张桌子,像: ID NAME ------------- 1 someValue 2 someValue 3 someValue 4 someValue ... ID NAME ------------- 1 var 2 var2 3 var3 4 var4 ... 我想在@表中插入表1中的2个结果,以及表2中的3个结果,使用不同的ID,目前我有如下内容: Declare @vars TABLE( field1 varchar(80),
ID NAME
-------------
1 someValue
2 someValue
3 someValue
4 someValue
...
ID NAME
-------------
1 var
2 var2
3 var3
4 var4
...
我想在@表中插入表1中的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
field1 field2 field3 field4 field5
-------------------------------------
val1 var2 val4 val7 var7
我得到了期望值,但是
- 还有更优雅的方式吗
这我想我做的不止这些
需要
医生。
我得到的结果是:
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
field1 field2 field3 field4 field5
-------------------------------------
val1 var2 val4 val7 var7
我不确定它是否更优雅,但这里有一个不同的查询,它也有同样的功能
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操作符执行此操作。如果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)
使用table1,table2,table3,…
old-style-JOIN语法,如果你不注意的话,你肯定会有笛卡尔积!我建议始终使用新的标准化ANSI连接语法:内部连接、左侧外部连接、右侧外部连接
等等嘿,这不公平!我打算发布一个比OP更优雅的解决方案。你应该在之后发布,以超越所有人!:)+1.