首先,我强烈建议您寻找替代方案。这将很快变得混乱,因为您实际上将行视为列。已经非规范化并没有太大帮助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用于返回IDin 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。