选择基于Subset的行

时间:2017-04-19 07:45:13

标签: sql sql-server sql-server-2008

我需要根据其他查询的结果编写sql查询。

考虑表数据:

id  attribute
1    a
1    b
2    a
3    a
3    b
3    c

我想编写查询以在属性集上选择id。 我的意思是首先我需要使用此查询检查id 1的属性:

select attribute from table where id = 1

然后根据这个结果我需要选择属性的子集。就像我们的情况一样,1(a,b)是3(a,b,c)的子集。我的查询应该在该案例中返回3。

如果我想检查2(a)的基础,它是1(a,b)和3(a,b,c)的子集,它应该返回1和3.

我希望,这是可以理解的。 :)

2 个答案:

答案 0 :(得分:2)

您可以使用此查询。  逻辑很简单:如果A中没有任何项目且不在B中 - > A是B的子集。

DECLARE @SampleData AS TABLE 
(
   Id int, attribute varchar(5)
)

INSERT INTO @SampleData
VALUES (1,'a'), (1,'b'),
(2,'a'),
(3,'a'),(3,'b'),(3,'c')

DECLARE @FilterId int = 1

;WITH temp AS
(
   SELECT DISTINCT sd.Id FROM @SampleData sd
)
SELECT * FROM temp t 
WHERE t.Id <> @FilterId
AND NOT EXISTS (
            SELECT sd2.attribute FROM @SampleData sd2 
            WHERE sd2.Id = @FilterId
            AND  NOT EXISTS (SELECT * FROM @SampleData sd WHERE sd.Id = t.Id AND sd.attribute = sd2.attribute)           
          ) 

演示链接:Rextester

答案 1 :(得分:1)

我会分三步给出一个查询:首先我得到所需id的属性,这是你写的查询

select attribute from table where id = 1

然后我会得到所需id

的属性数
select count(distinct attribute) from table where id = 1

最后我将上述结果用作过滤器

select  id
from    table
where   id <> 1 and
        attribute in (
            select attribute from table where id = 1 /* Step 1 */
        )
group by id
having  count(distinct attribute) = (
            select count(distinct attribute) from table where id = 1 /* Step 2 */
        )

这将为您提供最初提供的id'sattributesid的所有id等于初始np.max()的数字。