【问题标题】:SQL trigger to avoid duplicates with multiple IDsSQL 触发器以避免具有多个 ID 的重复项
【发布时间】:2017-02-18 11:45:48
【问题描述】:

早安,

我找到了我的问题的解决方案,但我想我还是会分享它,因为它可能对未来的项目/问题有用。我在下面有一个简单的 SQL 表,它将是我更大的股票价格市场数据表的外键。

CREATE TABLE [StockMarket]
(
[ID] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[ReutersRIC] VARCHAR(50),
[BloombergTicker] VARCHAR(50),
[YahooSymbol] VARCHAR(50)
/* other irrelevant columns here*/
)

考虑到这一点,我正在尝试增加结构的稳健性,因为我将从不同的数据源添加。对于金融市场上的每个基础时间序列,都有多个名称,具体取决于您使用的数据提供者。我想避免使用代表相同时间序列的不同数据源的多行。我需要一个触发器:

1) 如果插入的值还没有在表中,则简单地插入。

2) 如果我插入一条至少存在一个 [ReutersRIC]、[BloombergTicker]、[YahooSymbol]、[ISIN] 的行,我会改为更新该特定行。

2.1) 更新应该只发生在非 Null 条目上

我的问题是如何以最佳方式实现这一目标?我花了一些时间,但我想在下面分享答案以供将来参考。

【问题讨论】:

    标签: sql-server-2008 triggers duplicates


    【解决方案1】:

    这是我的解决方案:

    CREATE TRIGGER UniqueStockMarketInserts ON [dbo].[StockMarket]
    INSTEAD OF INSERT
    AS
    BEGIN
        DECLARE @StockId  int
        SELECT @StockId = S.ID 
            FROM [StockMarket] S INNER JOIN [INSERTED] I 
            ON
            S.YahooSymbol = I.YahooSymbol OR
            S.ReutersRIC = I.ReutersRIC OR 
            S.BloombergTicker = I.BloombergTicker OR
            S.ISIN = I.ISIN
        IF @StockId IS NULL
        BEGIN
            INSERT INTO [StockMarket] (YahooSymbol,ReutersRIC,BloombergTicker,ISIN)
            SELECT I.YahooSymbol, I.ReutersRIC, I.BloombergTicker, I.ISIN 
            FROM [INSERTED] I
        END
        ELSE
        BEGIN
        UPDATE S SET 
            S.ISIN = ISNULL(S.ISIN,I.ISIN),
            S.YahooSymbol = ISNULL(S.YahooSymbol,I.YahooSymbol),
            S.ReutersRIC = ISNULL(S.ReutersRIC,I.ReutersRIC),
            S.BloombergTicker = ISNULL(S.BloombergTicker,I.BloombergTicker)
            FROM INSERTED I, StockMarket S
            WHERE S.ID = @StockId
        END
    END
    GO
    

    这是我用现实生活中的例子对其进行的测试(除了我编造的 ISIN):

    /*-----------TESTING THE TRIGGER--------*/
    INSERT INTO StockMarket (ReutersRIC, BloombergTicker) VALUES ('G.TO', 'GG US Equity');
    INSERT INTO StockMarket (YahooSymbol, BloombergTicker, ISIN) VALUES ('GOOG', 'GOOG US Equity','US123454321');
    INSERT INTO StockMarket (YahooSymbol, ISIN) VALUES ('RDSA','NL111112222')
    INSERT INTO StockMarket (YahooSymbol, ReutersRIC) VALUES ('GG', 'G.TO');     /*this should update as per trigger*/
    INSERT INTO StockMarket (ReutersRIC, ISIN) Values ('GOOG.OQ','US123454321'); /*this should update as per trigger*/
    INSERT INTO StockMarket (YahooSymbol, ReutersRIC) Values ('RDSA', 'RDSa.L'); /*this should update as per trigger*/
    

    结果:

    希望这可以帮助将来的人。快乐编码

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多