2012-05-21 87 views
1

例如,我有一个头表,其中包含一个列id和一个带有id,head-id(引用head-table => 1到N)的位置表和一个值。现在我在头表中选择一行,比如说ID 1.我查看位置表并找到2行,它们引用了头表,并且具有值1337和1338.现在我想要选择所有头也是2个位置,这些值为1337和1338. position-id不一样,只是值,因为它不是M到N的关系。任何人都可以告诉我一个SQL语句?我不知道要完成它:/比较值列表

+1

如果你编辑了你的文章,并且每个表格只显示了每个表格的列,那么这将会很有帮助。 – octopusgrabbus

回答

0

假设该值不在位置表中给定的headid重复,并且它从不为NULL,那么可以使用以下逻辑来执行此操作。在位置表上完成一个完整的外部连接,以便处理您关心的特定头部位置。然后检查是否有完全匹配。

下面的查询做到这一点:

select * 
from (select p.headid, 
      sum(case when p.value is not null then 1 else 0 end) as pmatches, 
      sum(case when ref.value is not null then 1 else 0 end) as refmatches 
     from (select p.value 
      from position p 
      where p.headid = <whatever> 
      ) ref full outer join 
      position p 
      on p.value = ref.value and 
       p.headid <> ref.headid 
    ) t 
where t.pmatches = t.refmatches 

如果你有在值NULL值,你可以适应这些使用聚结。如果你有重复,你需要更清楚地说明在这种情况下要做什么。

0

假设你有:

Create table head 
(
    id int 
) 

Create table pos 
(
    id int, 
    head_id int, 
    value int 
) 

,你需要找到值重复,那么我会使用:

Select distinct p.head_id, p1.head_id 
from pos p 
join pos p1 on p.value = p1.value and p.head_id<>p1.head_id 
where p.head_id = 1 

特定head_id,或不过去那里每一个head_id

+0

** **头ID ** **位置ID ,head_id,值 1,1,1337 2,1,1338 3,2,1330 4,3, 1337 4,3,1338 我选择头的第一行...所以我得到的位置与id 1和2.现在我想要所有具有相同值(位置)的头。所以我想要的结果是head-id 1和3,因为id 3的头也有2个值为1337和1338的位置。values-column是一个字符字段,不是整数。 – dcast

+0

然后'从...中选择不同的p.head_id应该给你你想要的。值类型无关紧要,只是为了举例说明。 –