sequelize.js - 如何在 LEFT JOIN 中嵌套 INNER JOIN
问题描述
想象一下,我的 [Persons] 和 [Phones] 表之间有一个关联表 [PersonPhones]。我运行以下查询:
续集
Person.findAll({
include: [{
model: PersonPhones,
required: false,
include: [{
model: Phones,
required: true
}]
}]
});
问题:
我假设我会得到相当于下面的查询 1,它返回 4 行。但我得到的是查询 2,它只返回 2 行。有没有办法强制 Sequelize 将 INNER JOIN 嵌套在 LEFT JOIN 下?
SQL
CREATE TABLE #Persons (id INT, name VARCHAR(50))
CREATE TABLE #Phones (id INT, number VARCHAR(20))
CREATE TABLE #PersonPhones (personId INT, phoneId INT)
INSERT INTO #Persons VALUES (1,'Adam'), (2, 'Bob'), (3, 'Carl')
INSERT INTO #Phones VALUES (1, '555-1234'), (2, '555-2345'), (3, '555-3456')
INSERT INTO #PersonPhones VALUES (1,1), (1,3), (2, 4)
-- The following are not the same queries
-- Query 1
SELECT *
FROM #Persons p
LEFT JOIN #PersonPhones pp
INNER JOIN #Phones ph ON ph.id = pp.phoneID
ON pp.personID = p.ID
-- Query 2
SELECT *
FROM #Persons p
LEFT JOIN #PersonPhones pp ON pp.personID = p.ID
INNER JOIN #Phones ph ON ph.id = pp.phoneID
解决方案
试试这个:
-- Query 1
SELECT *
FROM #Persons p
LEFT JOIN (
select * from #PersonPhones pp
INNER JOIN #Phones ph ON ph.id = pp.phoneID
) x ON x.personID = p.ID
推荐阅读
- node.js - 如果产品已添加到使用 express.js 和 mongodb 制作的产品目录中的愿望清单/购物车中,如何获取信息
- javascript - 指定所需的 TypeScript 版本
- c# - 如何从 C# 调用 DLL 中的 C 函数?
- javascript - 使用 async/await Promise NodeJS 获取事务哈希
- python - 使用 crontab 运行 fabfile
- php - PHP在具有多个表单输入的同一列中添加数据
- excel - 从桌面文件夹内所有已关闭的工作簿中复制一定范围并将其粘贴到当前(主)工作簿
- git - 如何逐个合并
- c# - .Net Core Azure 函数 - 无法绑定
- java - 在更少的项目上进行循环操作