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