SQL 以 AND 条件加入 N-M 关系
SQL join on N-M realtion with AND condition
我有 TableA
和 TableB
以及 多对多 (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 中用准备好的语句实现这个自动化是一团糟。
我有 TableA
和 TableB
以及 多对多 (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 中用准备好的语句实现这个自动化是一团糟。