3

所以我有两张桌子。首先是名称及其资格:

用户:

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 所需的两个资格,则可以将它们关联在一起。

4

2 回答 2

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 行,则表示用户对该属性有两个资格,我们必须显示它。

于 2012-12-19T00:18:07.147 回答
1

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

我提出的查询如下:

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功能。

于 2012-12-19T15:02:24.243 回答