2012-12-19 50 views
3

所以我有兩個表格。首先是名字和他們的資格:通過SQL中的兩列將一個錶鏈接到另一個表格

用戶:

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 

因此,如果名稱有屬性所要求的兩個條件,就可以關聯在一起。

+1

你使用的是什麼rdbms? – Taryn

+0

@mnstoddard你是否設法解決這個問題? – DMK

回答

4

我這樣做:

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

我想加盟與屬性表的每個用戶,基於任何所需屬性資格的各資格。然後我按屬性和名稱進行分組並計算行數。

如果用戶名和屬性的組合有兩行,這意味着用戶有兩個資格的屬性,我們必須證明這一點。

+0

工作得很好,雖然我的問題比我發佈的要複雜一點,但我能夠使用您發佈的內容作爲我的代碼的良好基礎。謝謝你的幫助! – mnstoddard

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功能不會提供給你的工作。

相關問題