2010-11-16 74 views
1

我正在定义删除触发器,我需要备份已删除的行,但只包含来自原始数据的几个参数,并且包括来自其他表的一列:
TableC :
* 1列:从列值在表A
*列2至6:从表B用多个表中的值插入行(SQL Server)

值从colums 1,2,3,5,6

我要的是这样的:

INSERT into TableC values (
(SELECT Column1A from TableA where TableA.Column = 'SomeValue'),
(SELECT column1, column2, column3, column5, column6 from TableB));

TableC上的结果必须为:
Column1A,column1,column2,column3,column5,column6

但这不起作用。 在我的特例中,TableB是仅在触发器中可访问的已删除表。

我正在使用SQL-Server 2008,但我需要的是查询的逻辑,然后我尝试将其翻译。

谢谢。

回答

1

在另一种情况下,我真的觉得很奇怪,这可能是更接近你所描述的东西,这可能工作:

INSERT INTO MyTable 
SELECT 
    (SELECT ColumnA FROM Table1), 
    Table2.ColumnA, 
    Table2.ColumnB, 
    Table2.ColumnC, 
    Table2.ColumnD 
FROM 
    Table2 

这样的话,你只能选择从Table1一列,然而从Table2中选择很多列,而不管它们之间的任何关系。

+0

这就是我一直在寻找的!谢谢你的快速回答。 – fern17 2010-11-16 05:50:52

+0

显然,如果'Table1'返回多于一行,就会中断;所以你必须确保你只在这个独特的条件下运行它。 – BeemerGuy 2010-11-16 05:51:42

+0

是的,我明白了。但这就是这种情况:) – fern17 2010-11-16 05:53:01

1

您需要对select进行连接。
下面是一个例子:

INSERT INTO MyTable 
SELECT 
    Table1.ColumnA, 
    Table1.ColumnB, 
    Table2.ColumnA, 
    Table2.ColumnB 
FROM 
    Table1 
    INNER JOIN Table2 ON Table1.ID = Table2.ID 

这仅仅是“从两个表中插入”的一个例子。
您需要对其进行修改以符合您要查找的内容,这是我从您的任意示例中无法理解的。

+0

这是正确的,但两个表是不相关的! 第一张表只包含一个索引,第二个值... – fern17 2010-11-16 05:27:35

+0

我会保留这个答案给其他人参考;检查我的其他答案。 – BeemerGuy 2010-11-16 05:34:52

1

可以使用cross join加入不相关的表:

INSERT MyTable 
     (col5, col7) 
SELECT t1.col5 
,  t2.col7 
FROM Table1 t1 
CROSS JOIN 
     Table2 t2 
WHERE t1.ID = 'SomeValue' 
     and t2.ID = 'OtherValue' 

如果一个表只包含一行,则可以省略where一部分吧。

+0

我以Beemer说的方式做了。我不明白这种方式:(但谢谢你的快速答案! – fern17 2010-11-16 05:50:05