假设SQL Server (2012)中有下表:
MyTable:
Col1: Col2: Col3: Col4: Val1: ... Valn:
a b c d 123 1234
....我希望创建一个映射表,将Col1 - Col4中的特定值映射到特定的标签。因此,例如,它可以如下所示:
MyMaps:
Col1: Col2: Col3: Col4: Label:
a <null> <null> d Label1
<null> b <null> d Label2 例如,第一行可以读为:将标签'Label1‘给MyTable中的任何一行,其中为 = 'd'。
因此,我创建的允许此映射的查询是:
SELECT
MyMaps.Label
,MyTable.Val1
...
,MyTable.Valn
FROM
MyTable
INNER JOIN MyMaps
ON ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '')
AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '')
AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '')
AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '')这是可行的,但我很好奇这是否是实现这一目标的好方法,还是有一种更好/更有效的方法来创建映射,因为MyTable是一个相当大的表。
有什么想法/建议吗?
发布于 2016-04-26 18:31:27
有多种方法可以这样做,如选择第一个匹配项或使用复杂联接或使用循环编写复杂的TSQL等等。
SELECT
t.*,
Label = (
--since there can be multiple matches, this is where you apply your rules
select top 1 label
from MyMaps
where ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '')
AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '')
AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '')
AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '')
)
FROM MyTable t如果是为了一张小桌子,那就没问题。对于大型表,您可能希望有一个映射表来定义MyTable如何映射到MyMaps (将其重命名为MyTableLabel)。可以在执行insert或update操作时计算映射。
或者,如果提前知道MyMaps,即查找表,则可以定义所有组合,如(a、b、c、d、标签1)、(null、b、c、null、label2)、(null、d、label3)。这样,您就可以加入,而不必进行合并和ISNULL。
https://stackoverflow.com/questions/36580564
复制相似问题