首先,我强烈建议您寻找替代方案。这将很快变得混乱,因为您实际上将行视为列。已经非规范化并没有太大帮助Table1
- 尽管如果它真的只有 3 列,那么再次规范化它并不是什么大不了的事。:
CREATE VIEW v_Table1 AS
SELECT Id, Code1 as Code FROM Table1
UNION SELECT Id, Code2 as Code FROM Table1
UNION SELECT Id, Code3 as Code FROM Table1
如果我们带您进行第二个查询,您似乎需要 and 的所有可能组合,ID
以及Category
该组合是否出现在中的布尔值Table2
(Code
用于返回ID
in Table1
)。
由于似乎没有 and 的规范列表ID
,Category
我们将生成它:
CREATE VIEW v_AllCategories AS
SELECT DISTINCT ID, Category FROM v_Table1 CROSS JOIN Table2
获取代表列表ID
并且Category
非常简单:
CREATE VIEW v_ReportedCategories AS
SELECT DISTINCT ID, Category FROM Table2
JOIN v_Table1 ON Table2.Code = v_Table1.Code
把它们放在一起,我们就可以得到布尔值来告诉我们哪个存在:
CREATE VIEW v_CategoryReports AS
SELECT
T1.ID, T1.Category, CASE WHEN T2.ID IS NULL THEN 0 ELSE 1 END as Reported
FROM v_AllCategories as T1
LEFT OUTER JOIN v_ReportedCategories as T2 ON
T1.ID = T2.ID
AND T1.Category = T2.Category
这会让你以标准化的形式得到你的答案:
ID | Category | Reported
10 | cat1 | 1
10 | cat2 | 1
10 | cat3 | 0
从那里,您需要执行 aPIVOT
以将您的Category
值作为列:
SELECT
ID,
cat1,
cat2,
cat3
FROM v_CategoryReports
PIVOT (
MAX([Reported]) FOR Category IN ([cat1], [cat2], [cat3])
) p
由于您提到了 50 多个“类别”,我假设它们不是真正的“cat1”-“cat50”。在这种情况下,您需要编写生成枢轴操作的代码。
带有自包含示例的 SqlFiddle。