【发布时间】:2013-05-10 01:55:37
【问题描述】:
我有一个巨大的主表(1tb 数据)和 20 多列。我的源数据包含 0 个或更多缺失的数据字段。我必须通过匹配主表中的可用字段来填充缺失的数据。请考虑以下示例:
传入数据:
CREATE TABLE #t1 ( f3 VARCHAR(50), f1 INT, f2 INT )
INSERT INTO #t1
SELECT 'Row1',1, NULL
UNION ALL
SELECT 'Row2', 1, 2
主表:
CREATE TABLE #t2 ( f1 INT, f2 INT, f3 INT, f4 VARCHAR(255) )
INSERT INTO #t2
SELECT 1, 2, 3, 'A'
UNION ALL
SELECT 1, 2, 4, 'B'
UNION ALL
SELECT 1, 3, 3, 'C'
UNION ALL
SELECT 1, 3, 4, 'D'
UNION ALL
SELECT 2, 3, 4, 'E'
我希望输出将第 1 行链接到 A、B、C 和 D 行,将第 2 行链接到 A 和 B 行。我可以通过以下方式实现:
SELECT a.f3, b.*
FROM #t2 b
CROSS JOIN #t1 a
WHERE Patindex(Isnull(CONVERT(CHAR(1), a.f1), '_') + Isnull(CONVERT(CHAR(1), a.f2), '_')
, CONVERT(CHAR(1), b.f1) + CONVERT(CHAR(1), b.f2)) != 0
DROP TABLE #t1
DROP TABLE #t2
这不是一个非常可扩展的解决方案,因为当我有 20 个字段时它会变成又长又复杂的 SQL。
有没有更好的解决方案?
【问题讨论】:
-
那么,如果输入具有该列的值,您希望在相应列上匹配(“=”),但如果该列为 NULL,则跳过该列(即,将其视为通配符)?对吗?
标签: sql-server tsql join jointable