在SQL Server 2012中使用两个表合并查询

时间:2013-05-24 14:41:19

标签: sql-server merge

我是SQL和SQL服务器的新手,对以下问题有任何帮助。

我正在尝试用新价格更新股价表。

该表有三列:共享代码,日期,价格。

股票代码+日期= PK

您可以想象,如果您拥有数千个共享代码和10年的数据,那么该表可能会变得非常大。所以我创建了一个名为共享ID表的单独表,并在第一个表中使用共享ID(我被可靠地告知这将加快查询速度,因为按整数搜索比字符串更快)。

总而言之,我有两个表如下:

Table 1 = Share_code_ID (int), Date, Price
Table 2 = Share_code_ID (int), Share_name (string)

所以,假设我想用今天的ZZZ股票价格来更新表格。我需要:

  1. 在表2中查找与“ZZZ”对应的Share_code_ID
  2. 如果找到,请使用我刚刚找到的Share_code_ID以该日期的新价格更新表格
  3. 如果找不到Share_code_ID,请更新两个表
  4. 现在让我们忽略如何为新代码生成Share_code_ID,稍后我会担心。

    我正在尝试基于以下结构松散地使用合并查询,但不知道我在做什么:

    MERGE INTO [Table 1]           
    USING (VALUES (1,23-May-2013,1000)) AS SOURCE (Share_code_ID,Date,Price)                    
    
    { SEEMS LIKE THERE SHOULD BE AN INNER JOIN HERE OR SOMETHING }   
    
    ON  Table 2 = 'ZZZ' 
    WHEN MATCHED THEN UPDATE SET Table 1.Price = 1000    
    WHEN NOT MATCHED THEN INSERT { TO BOTH TABLES }  
    

    任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

http://msdn.microsoft.com/library/bb510625(v=sql.100).aspx

您使用Table1作为target table,将Table2作为source table使用 如果在表2中找不到给定ID,则需要执行操作 - 在source table

在您已阅读的文档中,该文档对应于

子句
WHEN NOT MATCHED BY SOURCE ...  THEN <merge_matched>

,后者对应

<merge_matched>::=
    { UPDATE SET <set_clause> | DELETE }

Ergo,你不能在那里插入源表。 你可以使用触发器自动插入,当你在Table1中插入一些东西,但是无法插入正确的Shared_Name时 - 触发器就是不知道它。

所以我猜你有两种选择。

1)制作T-SQL代码块 - 查找存储过程。我认为还有一个构造在MS SQ中执行匿名代码块,比如Firebird SQL Server中的EXECUTE BLOCK命令,但我不确定。

2)创建可更新的SQL VIEW,连接Table1和Table2以显示最后一个当前日期,这样当您在此视图中插入行时,视图的插入触发器实际上会向两个表插入行。当您更新视图中的数据时,更新后触发器将修改数据。