oob*_*oob 2 sql t-sql sql-server join
我无法想出这个问题的标题因为我不确定如何做我想要的,所以我不确定"加入"是否是这个例子中最好的术语.
我的数据库中有两个表,计划和假设如下所示:
计划表
Plankey ass1 ass2 ass3 ass4 aplan 0 6 5 7 bplan 2 0 7 4
假设表
assType refKey assName "ass1" 0 "gender factors a" "ass1" 2 "gender factors b" "ass2" 0 "age factors a" "ass2" 6 "age factors b" "ass3" 5 "inflation factors a" "ass3" 7 "inflation factors b" "ass4" 4 "tax factors a" "ass4" 7 "tax factors b"
我需要创建一个查询(或一组查询和子查询),它们为我提供了每个计划使用的假设的名称:
Plankey assName1 assName2 assName3 assName4 aplan "gender factors a" "age factors b" "inflation factors a" "tax factors b" bplan "gender factors b" "age factors a" "inflation factors b" "tax factors a"
是的,我知道.assName.此外,即使这不是最好的设计,这是我无法控制的.我只是想查询一组现有数据.
我还应该提到有超过500种假设类型(ass1,ass2,...,ass500等),每种类型可以有超过100种假设的refKey/Names.
我试图绕过这个看起来很容易,但我无法弄清楚如何做到这一点.有任何想法吗?也许有一个我失踪的概念,因为我还没有遇到它.我可以将列名称assName1,assName2等硬编码到我的查询中,但即使这样,我也不确定如何从Assumptions表中"查找"assNames,因为我似乎正在从同一个表中查找多个我的结果中的列.
编辑:我省略了一些非常重要的事情.refkey在假设表中重复使用.因此assName由assType和refKey的组合唯一确定.我为在我的例子中没有说清楚而道歉!在我查看答案之前,我忘记了这一点.我已经改变了我的例子以反映这一点.
EDIT2:我正在使用MS SQL Server.
EDIT3:我希望在每个计划的假设表中找到匹配.如果没有,我会遇到更大的问题 - 尽管与这个问题无关.
对于ASSUMPTIONS表中的每一ass#列,您必须LEFT JOIN到PLANS表中:
SELECT p.plankey,
a1.assname,
a2.assname,
a3.assname,
a4.assname
FROM PLANS p
LEFT JOIN ASSUMPTIONS a1 ON a1.refkey = p.ass1
AND a1.asstype = 'ass1'
LEFT JOIN ASSUMPTIONS a2 ON a2.refkey = p.ass2
AND a2.asstype = 'ass2'
LEFT JOIN ASSUMPTIONS a3 ON a3.refkey = p.ass3
AND a3.asstype = 'ass3'
LEFT JOIN ASSUMPTIONS a4 ON a4.refkey = p.ass4
AND a4.asstype = 'ass4'
Run Code Online (Sandbox Code Playgroud)
在不知道数据库的情况下,我无法提供动态SQL的语法来为需要执行的不同数量的连接构造查询.