【问题标题】:How to Nest INNER JOINs in LEFT JOINs如何在 LEFT JOIN 中嵌套 INNER JOIN
【发布时间】:2019-04-01 20:09:38
【问题描述】:

假设我的 [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


    【解决方案1】:

    在与该库的一位创建者交谈后,有人告诉我嵌套连接不是受支持的功能。 I have created an issue with their GitHub project。随意评论或从那里关注。

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

      • 感谢您的回复,但这是一个 Sequelize.js 问题。
      • @astangelo 抱歉,没意识到。 :-(
      猜你喜欢
      • 2018-07-10
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多