这可能是一个有点奇怪的问题:
我们项目的数据模型有多个表和多个列,其中任何一个都可以用来连接一个设置表。这里的问题是如何获取用于连接到 OR 连接中的设置表的列的名称?
例如,假设查询如下所示:
SELECT FIRST.ID, SEC.ID, TRD.ID, FRTH.ID, SETS.ID, SETS.VALUE
FROM ROOTTABLE FIRST
LEFT JOIN SECONDTABLE SEC ON SEC.SECDONTABLE_ID = FIRST.SECONDTABLE_ID
LEFT JOIN THIRDTABLE TRD ON TRD.THIRDTABLE_ID = FIRST.THIRDTABLE_ID
LEFT JOIN FOURTHTABLE FRTH ON FRTH.FOURTHTABLE_ID = TRD.FOURTHTABLE_ID
-- etc...
LEFT JOIN SETTINGTABLE SETS
ON (SETS.ID = FIRST.ONESETTING_ID OR SETS.ID = FIRST.SECONDSETTING_ID
OR SETS.ID = FIRST.THIRDSETTING_ID OR SETS.ID = TRD.RANDSETTING_ID
OR SETS.ID = FRTH.ONESETTING_ID
-- etc...
)
现在,这是真正发生的事情的一个非常经过分析的例子。我们可能有几十个表,每个表都有几个连接列到 SETTINGTABLE。
显然,仅对每个 table.column 进行单独的连接就会显示所使用的列。或者,您可以在选择中使用 CASE 子句。但任何一个都很棘手,需要大量的手动输入。即使只是在选择中使用所有连接的 ID 列也可以让您比较 ID,但由于结果需要非技术人员可读,所以这不会有太大帮助。
那么有没有一种方法可以使用一些 sys 对象或类似的对象来简单地返回实际用于连接到 SETTINGTABLE 的列名?设计就是这样,不会改变。所以我只是想找到最好的方法来处理我们现有的东西。这将显着加快我们对某些脚本、查询和数据的诊断速度。
谢谢!
没有
sys
对象或 DMV 会为您提供此类信息。您必须自己构建它,为此您可以查看下面的示例。让我们准备一些表格和虚拟数据。
下面是带有 MATCHES 列的查询,显示从 (SETS.ID = ?) 满足 JOIN 条件的位置。
VALUES
请注意,我已经在行构造函数和子句中列出了可以匹配 (1-5) 的源,ON
以便您可以遵循该模式。结果:
一些注意事项:
OR
s 意味着SETS.ID
可以与任何来源匹配 - 查询显示它们全部以逗号分隔。(1, 1, 1, 5)
与 SETS.ID 匹配三次。SQL小提琴
为清楚起见,此其他SQL Fiddle
*SETTING_ID
显示了用于匹配 SETS.ID的附加列。