用于覆盖记录的SQL查询

时间:2013-02-18 17:32:34

标签: sql sql-server linq

我有一个配置表,其中有30条默认配置记录。对于其他配置,我为那些不同的设置添加新记录。 例如:

ConfigurationId     SettingKey          SettingValue
1(default)             A                    2
1(default)             B                    5
1(default)             C                    9
.                      .                    .
.                      .                    .
2                      A                    5
3                      B                    7

在这里,您可以看到ConfigurationId 1,默认设置包含所有30个设置。 对于像2这样的其他配置只有A的设置而3只有B

所以当我获取Id 2的记录时,我希望2中不存在的所有SettingKey和SEttingValue应该来自1,而存在于2中的将被覆盖 像这样

ConfigurationId     SettingKey          SettingValue
2                     A                    5
2                     B                    5
2                     C                    9

因此对于2,所有30个设置应该来自1,它将被2中可用的设置覆盖。在设置键A中,已被2覆盖.B,C来自1

请问我是否不清楚。

1 个答案:

答案 0 :(得分:0)

你可以试试这个。

DECLARE @SeletedConfigurationID int

SELECT Settingkey, SettingValue
FROM
    (
    SELECT SettingKey, SettingValue,
        row_number() over (partition BY SettingKey ORDER BY ConfiurationID DESC) AS rn
    FROM Configuration
    WHERE ConfigurationID = 1
        OR ConfigurationID = @SelectedConfigurationID
    ) AS Settings
WHERE rn = 1
ORDER BY SettingKey

内部派生查询从默认配置(ConfigurationID = 1)和所选配置的行中获取行。它为每个设置键设置一个行号,其中第1行将来自所选配置(如果存在)。否则,将使用默认配置中的值。

外部查询仅选择第一行,其中行号为1.