2014-11-17 4 views
0
SELECT 
    sum(CheckFinal.SUM) AS SUME, 
    strftime('%Y - %m', CheckDate) AS CheckDate 
FROM 
    CheckFinal 
WHERE CheckFinal.NUMER IN (
    SELECT 
     CheckDetail.NUMER 
    FROM 
     CheckDetail 
    WHERE 
     CheckDetail.NUMER IN (
      SELECT 
       PriceList.UniqID AS PriceListUniqID, 
       PriceList.Name AS PriceListName, 
       Category.UniqID 
      FROM 
       PriceList Join Category on PriceList.CATEGORY = Category.UniqID 
      WHERE (Category.UniqID = 2) 
     ) 
) 
GROUP BY strftime('%Y %m', CheckDate); 

У меня есть такой запрос, чтобы объединить данные из таблиц 4: - Категория (100 записей) - PriceList (20'000 записей) - CheckDetail (10'000 '000 записей) - CheckFinal (2'000'000 записей)SQL WHERE IN ... ВСТУПИТЬ стол

Ярким словом, я ищу элементы PriceList, которые отмечены как дети Category.UniqID # 2, тогда я хотел бы собрать все CheckDetail.NUMER, чтобы определить все значения продаж с помощью таких элементов PriceList. Кроме того, я ищу поссобимость для сбора всех файлов CheckFinal.NUMER.

Проблемы у меня есть:

  1. Это невозможно сделать ВЫБЕРИТЕ процедуру три (3) время вложенного (SQLite.3), я думаю, что это время, чтобы сделать JOIN и, но у меня нет опыта в присоединении
  2. CheckDetail огромный набор данных, это займет 2 секунды, чтобы найти только один пункт PriceList через 10 миллионов записей и у меня есть 3'000 детали в моем запросе WHERE (Category.UniqID = 2)

в моем случае, я должен LookUp 3'000 раз через 5'000'000 записей, но у меня есть 10 наборов и th e запрос потратит около 10 часов, чтобы успеть.

JOIN оптимизирует время запроса? Как сделать такой JOIN QUERY?

Есть ли какие-либо инструменты GUI для создания запроса с помощью конструктора или что-то в этом роде?

UPD:

http://sqlfiddle.com/#!5/50a93/2 (используйте SQL.js для вставки нескольких строк данных)

+1

Если вы предоставляете sqlFiddle МОГУ попробуйте. –

+0

Я бы предположил, что вы ни в коем случае не должны запрашивать какую-либо базу данных с полным пониманием объединений. И ни при каких обстоятельствах вы не используете графический интерфейс для присоединения, вам нужно понять это, это просто. – HLGEM

+1

Оптимизация производительности невозможна, если вы храните секретную схему базы данных. –

ответ

0

С JOIN, вы запрос будет выглядеть

 SELECT 
      sum(CF.SUM) AS SUME, 
      strftime('%Y - %m', CF.CheckDate) AS CheckDate 
     FROM 
      PriceList 
      Join Category 
      on PriceList.CATEGORY = Category.UniqID 
      AND Category.UniqID = 2 
      JOIN CheckDetail CD 
      ON CD.NUMBER = PriceList.UniqID 
      JOIN CheckFinal CF 
      ON CF.NUMBER = CD.NUMBER 
     GROUP BY strftime('%Y - %m', CF.CheckDate); 
+0

Я думаю, что вы на самом деле предназначались для 'group by strftime ('% Y -% m', CF.CheckDate)' – Rahul

+0

См. Обновленную ссылку sqlFiddle. Это не работает. – Daniel

+0

@ Daniel, с значением sirf 4 нет записей в archeck, для categ со значением 2 только запись с sirf 4 maching в main, также обновленная группа, чтобы быть такой же, как select. Когда sirf задано как 1, вы получаете результат, поскольку есть соответствующие записи – radar