SQL Help - SQL Experts
7 отговора
755 прегледа
SQL Help - SQL Experts
Здравейте!
Много ще се радвам някой ако може да помогне с 1 заявка че яко омазах.
Имам таблица Movements с полета - (ID, ProductID, From, To)
Описва движението на продукти из складове. Примерно ако продукт 1 се е движил по складове 1,2,5,3 то:
ID ProductID From To
1 1 1 1
2 1 1 2
3 1 2 5
4 1 5 3
Така знаем историята на движение продукта и къде е в момента(Знам че дизайна на базата е лош)
Въпроса е как да разбера в даден Склад какви продукти има в момента?
Единственото за което се сещам и работи коректно е (примерно искаме да видим всички продукти които в момента са в Складове 1,4 и 5):
SELECT * FROM Movements
where To in (1,4,5)
and ID in
(
SELECT * From Movements
group by ProductID
)
Само че това работи адски бавно! Чаках го 30минс и го килнах.
Надявам се някои да има идея!

Много ще се радвам някой ако може да помогне с 1 заявка че яко омазах.
Имам таблица Movements с полета - (ID, ProductID, From, To)
Описва движението на продукти из складове. Примерно ако продукт 1 се е движил по складове 1,2,5,3 то:
ID ProductID From To
1 1 1 1
2 1 1 2
3 1 2 5
4 1 5 3
Така знаем историята на движение продукта и къде е в момента(Знам че дизайна на базата е лош)
Въпроса е как да разбера в даден Склад какви продукти има в момента?
Единственото за което се сещам и работи коректно е (примерно искаме да видим всички продукти които в момента са в Складове 1,4 и 5):
SELECT * FROM Movements
where To in (1,4,5)
and ID in
(
SELECT * From Movements
group by ProductID
)
Само че това работи адски бавно! Чаках го 30минс и го килнах.
Надявам се някои да има идея!
Re: SQL Help - SQL Experts
Защо не го направиш с една заявка?
Ако предположим, че продуктите се движат само "напред" т.е. от по-малък към по-голям номер на склада
SELECT ProductID, MAX(To) AS Current_Location
FROM Movements
GROUP BY ProductID;
Ще ти изведе списък на продуктите и складовете в които те се намират в момента.
Съответно:
SELECT ProductID, MAX(To) AS Current_Location
FROM Movements
GROUP BY ProductID
HAVING Current_Location IN (1, 4, 5);
Ще ти даде каквото искаш.
Не, че ще е много бързо де. Пробвай с индекс върху (ProductID, To)
Между другото за какъв сървър иде реч?
salle.online.bg/sig
Ако предположим, че продуктите се движат само "напред" т.е. от по-малък към по-голям номер на склада
SELECT ProductID, MAX(To) AS Current_Location
FROM Movements
GROUP BY ProductID;
Ще ти изведе списък на продуктите и складовете в които те се намират в момента.
Съответно:
SELECT ProductID, MAX(To) AS Current_Location
FROM Movements
GROUP BY ProductID
HAVING Current_Location IN (1, 4, 5);
Ще ти даде каквото искаш.
Не, че ще е много бързо де. Пробвай с индекс върху (ProductID, To)
Между другото за какъв сървър иде реч?
salle.online.bg/sig
Re: SQL Help - SQL Experts
хмм, едва ли е реално само в едната посока да се шматкат продуктите :) се некой ше се обърка и ше върне продукт от склад 2 към склад 1.
ако в таблицата му ID е auto increment, дали не може това да се ползва? МАХ(ID) за даден продукт ще е реда който съдържа текущото местоположение на продукта. ама нещо ми идва нанагорно да го напиша тоз селект... дали не е време да си лягам деба...
ако в таблицата му ID е auto increment, дали не може това да се ползва? МАХ(ID) за даден продукт ще е реда който съдържа текущото местоположение на продукта. ама нещо ми идва нанагорно да го напиша тоз селект... дали не е време да си лягам деба...
Re: SQL Help - SQL Experts
Като гледам заявката, която си написал мисля че тя няма да ти върне артикулите, които имат наличност в указаните складове, а списък от тези които НЯКОГА са били в определен склад. Така че заявката, която ти е предложил salle изглежда по-читава за това, което си описал че искаш.
Ако не си си решил проблема, пиши - може и да ми дойде нещо по-добро на ум
Успех!
Ако не си си решил проблема, пиши - може и да ми дойде нещо по-добро на ум
Успех!
малко развитие на идеята ти
Мисля че това е коректната заявка... :)
Намираме най-голямото ID на движенията в склада и
после намираме полето To на съответсващия му запис.
(заявката е писана със синтаксиса на T-SQL -
за други сървъри би трябвало да е подобно)
SELECT *
FROM Movements
INNER JOIN (
SELECT ProductID, MAX(ID) AS CurrentID
FROM Movements
GROUP BY ProductID
) AS CurrentStore ON CurrentStore.ProductID = Movements.ProductID
AND CurrentStore.CurrentID = Movements.ID
WHERE Movements.To IN (1, 3, 4)
Намираме най-голямото ID на движенията в склада и
после намираме полето To на съответсващия му запис.
(заявката е писана със синтаксиса на T-SQL -
за други сървъри би трябвало да е подобно)
Re: SQL Help - SQL Experts
решението на DARKLORD изглежда правилно (поне на пръв поглед), но по отношение на бързодействието според мен нещата стоят така:
след като твоята заявка(без значение дали е вярна) толкова бавно се изпълнява, може да се допусне, че имаш доста данни => колкото и оптимална заявка да напишеш тя най-вероятно ще е доста бавна. Решението е индексиране. Не знам за какъв сървър говориш, но това няма значение. Индексирането попринцип променя много плана на изпълнение и наистина може да се полуи така, че без индекс една заявка да се изпълнява 30 мин, а с индекс 3 мин. Просто трябва да ги направиш правилно индексите.
след като твоята заявка(без значение дали е вярна) толкова бавно се изпълнява, може да се допусне, че имаш доста данни => колкото и оптимална заявка да напишеш тя най-вероятно ще е доста бавна. Решението е индексиране. Не знам за какъв сървър говориш, но това няма значение. Индексирането попринцип променя много плана на изпълнение и наистина може да се полуи така, че без индекс една заявка да се изпълнява 30 мин, а с индекс 3 мин. Просто трябва да ги направиш правилно индексите.
Re: SQL Help - SQL Experts
Zdravejte,
бих посъветвал да се смени малко логиката на таблицата Movements,
по принцип когато се прави таблица която отразява едновременно ситория и текущо състояние, To полето на текущото състояние е NULL, докато на историята е запълнено. Ако апликацията ти не е в много напреднал стадий бих те посъветвал да използваш този /стар/ трик
бих посъветвал да се смени малко логиката на таблицата Movements,
по принцип когато се прави таблица която отразява едновременно ситория и текущо състояние, To полето на текущото състояние е NULL, докато на историята е запълнено. Ако апликацията ти не е в много напреднал стадий бих те посъветвал да използваш този /стар/ трик
Re: SQL Help - SQL Experts
я пак? кога е NULL? кога не е? обясни го тоя стар трик че нещо не отлепям...