3

だから私は2つのテーブルを持っています。1つ目は、名前とその資格です。

ユーザー:

Name    Qualification
---------------------
User1   QualA  
User1   QualB  
User1   QualC  
User2   QualA  
User2   QualD  

次に、2つの条件を最初の属性から別の属性にリンクする2番目のテーブル:

属性:

Attribute   Qual1  Qual2
------------------------
Attr1       QualA  QualC    
Attr2       QualB  QualC    
Attr3       QualA  QualD    
Attr4       QualB  QualD    

次に、データをクエリしたいので、次のようなものを返します。

User     Attribute
------------------
User1    Attr1   
User1    Attr2  
User2    Attr3  

したがって、名前に属性に必要な2つの資格がある場合、それらを一緒に関連付けることができます。

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つの行がある場合、それはユーザーが属性に対して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以降を使用していない場合は、ランク機能を使用できません。

于 2012-12-19T15:02:24.243 に答える