SQL 以 AND 条件加入 N-M 关系

SQL join on N-M realtion with AND condition

我有 TableATableB 以及 多对多 (N-M) 关系 TableAB 的关系

TableA JOIN TableAB JOIN TableB

如何添加 AND 条件 以检查 TableAB 是否在 TableB

中包含多个条件的条目

也许是一个愚蠢但简单的例子:

TableA = firstnames
TableB = lastnames

我想要与姓氏“Smith”、“Black”和“Taylor”结合使用的所有名字

我考虑过使用

WHERE lastname = "Smith" or lastname = "Black" or lastname = "Taylor"

GROUP BY firstname and check if count(*) = 3

但这似乎不是正确的方法,因为 lastname = "Smith" or lastname = "Smith" or lastname = "Smith" 不应该 return 一个空的 table。

而且它应该很容易扩展,因为过滤器是用户输入的,不知道我得到了多少条件。

额外问题:我将 Sequelize 与多对多关联一起使用,不知道如何将它放在这里

编辑:

示例: 表A

id firstname
1 Tom
2 Alice
3 Bob

表B

id lastname
1 Smith
2 Black
3 Taylor

表AB

id id_firstname id_lastname
1 1 1
2 2 1
3 2 2
2 3 3

意思是我们有汤姆·史密斯、爱丽丝·史密斯、爱丽丝·布莱克、鲍勃·泰勒

查询:给我所有姓氏为 Smith 和 Black 的名字

结果:爱丽丝

一如既往:有不同的方法可以实现。一种是NMtable的多重连接。检查脚本末尾的 select(为 MS SQL 服务器编写)。脚本的其余部分只是创建示例数据。

create table TableA ( 
    ID int not null,
    Firstname nvarchar(255) not null);

create table TableB ( 
    ID int not null,
    Lastname nvarchar(255) not null);

create table TableAB(
    IDA int not null,
    IDB int not null);

GO

insert into TableA values (1, 'Tom');
insert into TableA values (2, 'Alice');
insert into TableA values (3, 'Bob');


insert into TableB values (1, 'Smith');
insert into TableB values (2, 'Black');
insert into TableB values (3, 'Taylor');

insert into TableAB values (1, 1);
insert into TableAB values (2, 1);
insert into TableAB values (2, 2);
insert into TableAB values (3, 3);

GO

select A.Firstname
from TableA A
inner join TableAB AB1 on A.ID = AB1.IDA
inner join TableB B1 on B1.ID = AB1.IDB 
inner join TableAB AB2 on A.ID = AB2.IDA
inner join TableB B2 on B2.ID = AB2.IDB 
where B1.Lastname = 'Smith'
  and B2.Lastname = 'Black'

其他方法是 sub-select 到 return 姓氏 + 名字的所有组合,然后过滤请求的姓氏并计算出现次数:

select Firstname 
from (
    select distinct A.Firstname, B.Lastname
    from TableA A
    inner join TableAB AB on A.ID = AB.IDA
    inner join TableB B on B.ID = AB.IDB
) t
where Lastname in ('Smith', 'Black')
group by Firstname
having count(*) = 2

两种方式都将return爱丽丝作为结果而已。

感谢您的回复。第二个与我认为可行的类似:

select A.Firstname, B.Lastname
from TableA A
inner join TableAB AB on A.ID = AB.IDA
inner join TableB B on B.ID = AB.IDB AND Lastname in ('Smith', 'Black')
group by A.Firstname having count(*) = 2

但必须检查是否所有用户输入的姓氏都不同,因为“in ('Smith', 'Smith')”将不适用于 count = 2

这就是为什么我认为存在更好的解决方案。第一个建议就可以了,但是在 sequelize 中用准备好的语句实现这个自动化是一团糟。