比较值列表

时间:2012-05-21 20:45:15

标签: sql

例如,我有一个带有一列id的头表和一个带id,head-id(对head-table => 1到N的引用)的位置表,以及一个值。现在我在head-table中选择一行,比如id 1.我查看位置表并找到引用头表的2行并且值为1337和1338.现在我想选择所有也有头的行这些值为1337和1338的2个位置。位置ID不同,只是值,因为它不是M到N的关系。谁能告诉我一个SQL语句?我不知道要完成它:/

2 个答案:

答案 0 :(得分: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,则可以使用coalesce来容纳这些值。如果您有重复项,则需要更明确地指定在这种情况下要做什么。

答案 1 :(得分: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的位置