Я пытаюсь выполнить запрос по модели с фильтрацией по свойству во включенной модели. Вот как выглядят параметры 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-й, когда в опциях включено поле "лимит"? Есть ли способ заставить его не выполнять ненужные вложенные запросы?
Спасибо