#sql #sqlite
#sql #базы данных SQLite #sqlite
Вопрос:
Таблица 1 с номером 1 (справочная таблица от 0 до 99)
Таблица 2 содержит дату, результат (содержит множество записей, уникальных по дате и результату)
Таблица 3 имеет результат Num1, Num2, Num3
Я хотел бы объединить таблицу 2 по результату в таблице 3 и сопоставить каждый номер таблицы 1 Num1 с одним из Num1, Num2 или Num3 в таблице 3, где дата равна < некоторой группе дат по таблице 1, поэтому возвращается только 100 строк.
Как вы можете заставить его остановиться один раз, если найдете соответствующие 100. Похоже, что он каждый раз полностью сканирует таблицу 2. Когда я подхожу ближе к концу таблицы, выбор происходит быстрее
Комментарии:
1. На какую третью таблицу ссылается заголовок? Как называется столбец в Table1? Что именно вы хотите увидеть? То, как оптимизатор сканирует таблицу, в основном является проблемой для оптимизатора. У вас есть соответствующие индексы на месте?
Ответ №1:
На первый взгляд, это может быть то, что вам нужно:
SELECT Num1 AS Num FROM Table2 WHERE Date < '2011-04-12'
UNION
SELECT Num2 AS Num FROM Table2 WHERE Date < '2011-04-12'
UNION
SELECT Num3 AS Num FROM Table2 WHERE Date < '2011-04-12'
При этом выбираются уникальные значения из Num1, Num2 и Num3 в Table2.
Неясно, зачем вам нужна Table1; однако можно было бы объединить этот результат со значениями в Table1, чтобы гарантировать, что выбранные значения отображаются в Table1.
Неясно, где находится третья таблица, упомянутая в названии, что она содержит и как к ней можно присоединиться.
Если, как я ожидаю, в этом вопросе отсутствует суть вопроса, вам нужно тщательно прояснить, что вы надеетесь увидеть.
Ответ №2:
Чтобы ограничить количество записей, возвращаемых запросом SELECT, вы можете использовать предложение LIMIT.
Я попытался создать запрос, который удовлетворяет тому, что я смог понять из вашего запроса. Но поскольку ваше объяснение было немного загадочным, скорее всего, я не совсем понял, чего вы хотите:
SELECT Table3.Num1
, Table3.Num2
, Table3.Num3
FROM Table3
INNER JOIN Table2
ON Table3.Result = Table2.Result
INNER JOIN Table1
ON Table1.Num1 IN (Table3.Num1, Table3.Num2, Table3.Num3)
WHERE Table2.Date < '2011-04-13'
ORDER BY Table2.Date
LIMIT 100 -- this will make sure only the first 100 records are returned
;
Если это делает то, что вы хотите, то вам, вероятно, следует рассмотреть возможность изменения дизайна ваших таблиц. Необходимость сравнивать Table1 со всеми тремя таблицами Table3.Num1, Num2 и Num3 выглядит очень странно и, что более важно, для меня очень неэффективно.