0

我对 SQL 和 SQL Server 非常陌生,希望对以下问题有任何帮助。

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

该表有三列:股票代码、日期、价格。

分享代码+日期=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 使用该日期的新价格更新表 1
  3. 如果未找到 Share_code_ID,则更新两个表

现在让我们忽略如何为新代码生成 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 }  

任何帮助,将不胜感激。

4

1 回答 1

0

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

当在 Table2 中找不到给定 ID 时,您使用 Table1target table和 Table2 来执行您想要执行的操作 - 在source tablesource table

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

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

后者对应于

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

因此,您不能在那里插入源表。当您在 Table1 中插入某些内容时,您可以使用触发器进行自动插入,但这将无法插入正确的 Shared_Name - 触发器只是不知道它。

所以我猜你有两个选择。

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

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

于 2013-05-31T16:03:10.193 回答