Sequelize создает вложенные запросы SELECT при применении WHERE к объединенной таблице и «ограничивает» в параметрах. - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь выполнить запрос по модели с фильтрацией по свойству во включенной модели. Вот как выглядят параметры sequelize.

const result = await A.findAll({
    attributes: [
        "id",
        "field1",
        "field2",
    ],
    limit: 10,
    include: [
        {
            model: B,
            attributes: ["id"],
            where: {
                fieldC: { [Op.substring]: "value" }
            },
        }
    ]
});

И он выполняет этот запрос в базе данных.

SELECT [a].*, [b].[Id] AS [b.id]
FROM (
    SELECT
           [a].[Id] AS [id],
           [a].[Field1] AS [field1],
           [a].[Field2] AS [field2]
    FROM [A] AS [a]
    WHERE (
        SELECT [Id]
        FROM [B] AS [b]
        WHERE (
            [b].[FieldC] LIKE N’%value%’ AND
            [b].[AId] = [a].[Id]
        )
        ORDER BY [b].[Id]
        OFFSET 0 ROWS
        FETCH NEXT 1 ROWS ONLY
    ) IS NOT NULL
    ORDER BY [a].[Id]
    OFFSET 0 ROWS
    FETCH NEXT 10 ROWS ONLY
) AS [a]
INNER JOIN [B] AS [b] ON [a].[id] = [b].[AId] AND [b].[FieldC] LIKE N’%value%’
ORDER BY [id];

Я не уверен, почему он выполняет вложенные запросы, если следующий запрос было бы достаточно. Фактически, если я удалю поле "limit" из параметров findAll, он выполнит запрос, как показано ниже (без ключевых слов OFFSET и FETCH)

SELECT
   [a].[Id] AS [id],
   [a].[Field1] AS [field1],
   [a].[Field2] AS [field2],
   [b].[Id] AS [b.id]
FROM [A] AS [a]
INNER JOIN [B] AS [b] ON [a].[Id] = [b].[AId] AND [b].[FieldC] LIKE N’%value%’
ORDER BY [a].[Id]
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

Почему sequelize запускает 1-й запрос вместо запроса типа 2-й, когда в опциях включено поле "лимит"? Есть ли способ заставить его не выполнять ненужные вложенные запросы?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...