通过SQL中的两列将一个表链接到另一个表

时间:2012-12-19 00:04:36

标签: sql join

所以我有两张桌子。第一个是姓名及其资格:

用户:

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  

因此,如果Name具有Attribute所需的两个限定条件,则它们可以关联在一起。

2 个答案:

答案 0 :(得分:4)

我会用这个:

select
  name, attribute
from
  users inner join attributes
  on users.qualification in (attributes.qual1, attributes.qual2)
group by attribute, name
having count(*)=2

我正在尝试根据属性所需的任何资格,为每个用户加入属性表。然后我按属性和名称进行分组并计算行数。

如果用户名和属性的组合有2行,则表示用户具有该属性的两个限定条件,我们必须显示它。

答案 1 :(得分:1)

我必须生成一个非常相似的查询,但在我的场景中,个人或用户可以多次获得相同的资格。因此,我必须得到比fthiella's解决方案更复杂的东西。

我提出的查询如下:

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

基本上我自己加入了表Users,列出了每个用户的所有资格组合,没有重复。然后,这允许我们对Attributes表进行简单连接。

当然,如果你没有使用Sql server 2005或更晚的Rank功能,你将无法使用。