SQL, SQLite Выберите из 3 таблиц

#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 выглядит очень странно и, что более важно, для меня очень неэффективно.