SQLite CASE-запрос с несколькими условиями - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь выполнить запрос, чтобы найти минимальную цену на различные товары в одном и том же магазине за одну и ту же неделю.

Когда у меня только два товара, запрос работает отлично.

Когда у меня 3 или более продуктов, я делаю что-то не так, но не знаю что.

Это то, что я использую для двух продуктов (работает нормально):

 select a.* , b.*,

 case when a.preis_pro_unze < b.preis_pro_unze then a.preis_pro_unze 
    when b.preis_pro_unze < a.preis_pro_unze then b.preis_pro_unze

end as minpreis

 FROM Heinz32_36 as a, Heinz32_36 as b 
WHERE
a.IRI_KEY = b.IRI_KEY 
AND a.week = b.week
AND a.UPC_DESC != b.UPC_DESC 

Это то, что я пробовал для трех продуктов (не работает):

Select a.UPC_DESC, a.IRI_KEY , a.WEEK , a.Price_per_unit, a.Preis_pro_unze, 
b.UPC_DESC, b.IRI_KEY , b.WEEK , b.Price_per_unit, b.Preis_pro_unze, 
c.UPC_DESC, c.IRI_KEY , c.WEEK , c.Price_per_unit, c.Preis_pro_unze, 
case 
when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = a.preis_pro_unze then a.preis_pro_unze
when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = b.preis_pro_unze then b.preis_pro_unze
when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = c.preis_pro_unze then c.preis_pro_unze

end as minpreis

FROM "prv24" as a , "prv24" as b, "prv24" as c

WHERE 

a.IRI_KEY = b.IRI_KEY = c.IRI_KEY AND
a.week = b.week = c.week AND

a.UPC_DESC  != b.UPC_DESC or a.UPC_DESC  != c.UPC_DESC
OR 
b.UPC_DESC != c.UPC_DESC  

LIMIT 10

Это может быть что-то с условиями "! =" В самом конце. Я уже пытался переписать его с помощью некоторых скобочных выражений, но это тоже не помогло.

Я работаю с SQLite. Я не получаю никаких сообщений об ошибках, но запрос обрабатывается бесконечно.

1 Ответ

0 голосов
/ 14 февраля 2020

Без примеров данных и схемы трудно быть уверенным, но я думаю, вам не хватает некоторых скобок. Условие OR означает, что ваш запрос оценивает все ваши условия AND, и , а затем дополнительно добавляет условие OR; это, вероятно, приводит к огромному набору данных, что объясняет бесконечную обработку.

Select a.UPC_DESC, 
       a.IRI_KEY , 
       a.WEEK , 
       a.Price_per_unit, 
       a.Preis_pro_unze, 
       b.UPC_DESC, 
       b.IRI_KEY , 
       b.WEEK , 
       b.Price_per_unit, 
       b.Preis_pro_unze, 
       c.UPC_DESC, 
       c.IRI_KEY , 
       c.WEEK , 
       c.Price_per_unit, 
       c.Preis_pro_unze, 
       case 
          when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = a.preis_pro_unze then a.preis_pro_unze
         when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = b.preis_pro_unze then b.preis_pro_unze
         when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = c.preis_pro_unze then c.preis_pro_unze

end as minpreis

FROM "prv24" as a , 
     "prv24" as b, 
     "prv24" as c

WHERE 

a.IRI_KEY = b.IRI_KEY = c.IRI_KEY AND
 a.week = b.week = c.week AND

(a.UPC_DESC  != b.UPC_DESC or 
a.UPC_DESC  != c.UPC_DES  OR 
b.UPC_DESC != c.UPC_DESC)  

Однако, вы можете обнаружить, что это имеет смысл намного больше смысла, если вы используете явный синтаксис объединения и используете значимый псевдонимы. Явные объединения позволяют избежать проблем, с которыми вы только что столкнулись (условие ИЛИ портит ваши объединения), и облегчают чтение вашего кода.

Вот гораздо более точная версия:

Select a.UPC_DESC, 
       a.IRI_KEY, 
       a.WEEK, 
       a.Price_per_unit, 
       a.Preis_pro_unze, 
       b.UPC_DESC, 
       b.IRI_KEY, 
       b.WEEK, 
       b.Price_per_unit, 
       b.Preis_pro_unze, 
       c.UPC_DESC, 
       c.IRI_KEY , 
       c.WEEK , 
       c.Price_per_unit, 
       c.Preis_pro_unze, 
       case 
          when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = a.preis_pro_unze then a.preis_pro_unze
          when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = b.preis_pro_unze then b.preis_pro_unze
          when min(min(a.preis_pro_unze , b.preis_pro_unze , c.preis_pro_unze )) = c.preis_pro_unze then c.preis_pro_unze
        end as minpreis 
FROM "prv24" as a 
      inner join  "prv24" as b
          on a.IRI_KEY = b.IRI_KEY
          and a.week = b.week
      inner join "prv24" as c
          on a.IRI_KEY = c.IRI_KEY
          and a.week = c.week
WHERE 
(a.UPC_DESC  != b.UPC_DESC or 
a.UPC_DESC  != c.UPC_DES  or 
b.UPC_DESC != c.UPC_DESC)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...