通过SQL中的两列将一个表链接到另一个表
所以我有两张桌子。首先是姓名及其资格: 用户:通过SQL中的两列将一个表链接到另一个表,sql,join,Sql,Join,所以我有两张桌子。首先是姓名及其资格: 用户: Name Qualification --------------------- User1 QualA User1 QualB User1 QualC User2 QualA User2 QualD 然后,第二个表将两个资格从第一个属性链接到另一个属性: 属性: Attribute Qual1 Qual2 ------------------------ Attr1 QualA
Name Qualification
---------------------
User1 QualA
User1 QualB
User1 QualC
User2 QualA
User2 QualD
然后,第二个表将两个资格从第一个属性链接到另一个属性:
属性:
Attribute Qual1 Qual2
------------------------
Attr1 QualA QualC
Attr2 QualB QualC
Attr3 QualA QualD
Attr4 QualB QualD
现在我想查询数据,因此我得到如下结果:
User Attribute
------------------
User1 Attr1
User1 Attr2
User2 Attr3
因此,如果名称具有属性所需的两个限定条件,则可以将它们关联在一起。我将使用以下方法:
select
name, attribute
from
users inner join attributes
on users.qualification in (attributes.qual1, attributes.qual2)
group by attribute, name
having count(*)=2
我试图根据属性所需的任何资格,将每个用户的每个资格与属性表连接起来。然后我按属性和名称分组,并计算行数
如果用户名和属性的组合有两行,这意味着用户对属性有两个限定,我们必须显示它。我必须生成一个非常类似的查询,但是在我的场景中,个人或用户可以多次获得相同的限定。因此,我不得不提出一些比解决方案更复杂的问题 我提出的问题如下:
SELECT
j2.name,
Qualification1,
Qualification2,
t3.Attribute
FROM
(SELECT
t1.name,
t1.qualification AS Qualification1,
J1.qualification AS Qualification2,
Rank() over (Partition BY t1.name, t1.qualification ORDER BY t1.qualification, J1.qualification) AS rank1,
Rank() over (Partition BY t1.name, J1.qualification ORDER BY J1.qualification, t1.qualification) AS rank2
FROM
Users t1
LEFT JOIN
(SELECT
t2.name,
t2.qualification
FROM
Users t2) J1
ON
t1.name = J1.name) J2
LEFT JOIN
Attributes t3
ON
t3.Qual1 = Qualification1
AND t3.Qual2 = Qualification2
WHERE
rank2 <= rank1
AND t3.Attribute IS NOT NULL
基本上,我自己加入表用户,列出每个用户的所有资格组合,没有重复。这样我们就可以对Attributes表进行简单的连接
当然,如果您不使用Sql server 2005或更高版本,您将无法使用该函数。@mnstoddard您是否设法解决了此问题?工作正常,尽管我的问题比我发布的问题稍微复杂一些,但我能够将您发布的内容用作我代码的良好基础。谢谢你的帮助!