所以我有两张桌子。第一个是姓名及其资格:
用户:
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所需的两个限定条件,则它们可以关联在一起。
答案 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功能,你将无法使用。