Как вложить ВНУТРЕННИЕ соединения в ЛЕВЫЕ соединения

#sequelize.js

#sequelize.js

Вопрос:

Представьте, что у меня есть таблица ассоциаций [PersonPhones] между моими таблицами [Persons] и [Phones]. И я запускаю следующий запрос:

Продолжение

 Person.findAll({
  include: [{
    model: PersonPhones,
    required: false,
    include: [{
      model: Phones,
      required: true
    }]
  }]
});
  

Вопрос:

Я бы предположил, что получу эквивалент запроса 1 ниже, который возвращает 4 строки. Но я получаю запрос 2, который возвращает всего 2 строки. Есть ли способ заставить Sequelize вложить ВНУТРЕННЕЕ СОЕДИНЕНИЕ в ЛЕВОЕ СОЕДИНЕНИЕ?


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
  

Ответ №1:

После разговора с одним из создателей библиотеки мне сказали, что вложенные соединения не поддерживаются. Я создал проблему с их проектом GitHub. Не стесняйтесь комментировать или следовать оттуда.

Ответ №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
  

Комментарии:

1. Спасибо за ваш ответ, но это Sequelize.js вопрос.

2. @astangelo Извините, не понял. 🙁