2012-05-21 92 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應該給你你想要的。值類型無關緊要,只是爲了舉例說明。 –