0

我有三个多对多格式的表。即,表 A、B 和 AB 已按您的预期设置。

给定一组 A id,我只需要选择 AB 中与所有 id 匹配的行。

像下面这样的东西是行不通的:

"SELECT * FROM AB WHERE A_id = 1 AND A_id = 2 AND A_id = 3 AND ..." 因为单行不会有多个 A_id

使用 sql 语句中的 OR 并没有更好,因为它产生的结果是所有具有至少一个 A id 的结果(而我只想要那些具有所有 id 的行)。

编辑:

对不起,我应该解释一下。我不知道实际的多对多关系是否与实际问题相关。这些表格概述如下:

Table People
int id
char name

Table Options
int id
char option

Table peoples_options
int id
int people_id
int option_id

所以我有一个人员列表,一个选项列表,以及一个选项和人员表。

因此,给定一个选项 ID 列表,例如 (1, 34, 44, ...),我只需要选择那些拥有所有选项的人。

4

3 回答 3

1

您的数据库似乎没有正确规范化。您的表的每一行都AB应该有一个A_id和一个。B_id如果是这种情况,您的OR-version 应该可以工作(尽管我会使用IN自己)。

忽略前一段。从您的编辑中,您真的想知道在多对多表中B具有 ' 的所有子集的所有' - 请参阅下面的查询。A

请告诉我们实际的架构细节,如果没有它,很难弄清楚你想要什么。

我希望看到类似的东西:

table a:
    a_id integer
    a_payload varchar(20)
table b:
    b_id integer
    b_payload varchar(20)
table ab:
    a_id integer
    b_id integer

根据您的描述,我唯一能想到的是您想要一个列表中包含所有B' 的所有A' 的AB列表。在这种情况下,您正在查看类似(获取B具有A1、3 和 4 的 ' 的列表):

select distinct b_id from ab n1             
    where exists (select b_id from ab where a_id = 1 and b_id = n1.b_id)     
    and   exists (select b_id from ab where a_id = 3 and b_id = n1.b_id)     
    and   exists (select b_id from ab where a_id = 4 and b_id = n1.b_id);    

这在 DB2 中有效,但我不确定您选择的服务器实现了多少 SQL。

于 2008-12-01T02:06:59.063 回答
0

一个 hacky 解决方案是将 IN 与 group by 一起使用并具有过滤器。像这样:

SELECT B_id FROM AB
WHERE A_id IN (1,2,3)
GROUP BY B_id
HAVING COUNT(DISTINCT A_id) = 3;

这样,您只能获得恰好具有 3 个 A_id 值的 B_id 值,并且它们必须来自您的列表。我在 COUNT 中使用了 DISTINCT,以防 (A_id, B_id) 不是唯一的。如果您需要其他列,则可以作为另一个 select 语句的 FROM 子句中的子选择加入此查询。

于 2008-12-01T02:24:10.310 回答
0

试试这个......它带来了与所有选项相关的所有人。

换句话说,该查询使所有人认为它不存在与它无关的选项。


select
    p.*
from
    people p
where
    not exists (
              select 
                      1 
              from 
                      options o
              where
                      not exists 
                      (
                          select 1
                          from   peoples_options po 
                          where  po.people_id     = p.people_id
                                 AND po.option_id = o.option_id
                      )
           )
于 2014-11-03T22:49:47.247 回答