通过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您是否设法解决了此问题?工作正常,尽管我的问题比我发布的问题稍微复杂一些,但我能够将您发布的内容用作我代码的良好基础。谢谢你的帮助!