首页 > 解决方案 > 如何在 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

标签: sequelize.js

解决方案


试试这个:

-- 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

推荐阅读