SQL Help - SQL Experts

7 отговора 755 прегледа
#1

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минс и го килнах.

Надявам се някои да има идея!

Отговор
в отговор на AiSiktiriks #2

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
Отговор
в отговор на salle #3

Re: SQL Help - SQL Experts

хмм, едва ли е реално само в едната посока да се шматкат продуктите :) се некой ше се обърка и ше върне продукт от склад 2 към склад 1.

ако в таблицата му ID е auto increment, дали не може това да се ползва? МАХ(ID) за даден продукт ще е реда който съдържа текущото местоположение на продукта. ама нещо ми идва нанагорно да го напиша тоз селект... дали не е време да си лягам деба...

Отговор
в отговор на AiSiktiriks #4

Re: SQL Help - SQL Experts

Като гледам заявката, която си написал мисля че тя няма да ти върне артикулите, които имат наличност в указаните складове, а списък от тези които НЯКОГА са били в определен склад. Така че заявката, която ти е предложил salle изглежда по-читава за това, което си описал че искаш.

Ако не си си решил проблема, пиши - може и да ми дойде нещо по-добро на ум
Успех!

Отговор
в отговор на salle #5

малко развитие на идеята ти

Мисля че това е коректната заявка... :)

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 -
за други сървъри би трябвало да е подобно)

Отговор
в отговор на AiSiktiriks #6

Re: SQL Help - SQL Experts

решението на DARKLORD изглежда правилно (поне на пръв поглед), но по отношение на бързодействието според мен нещата стоят така:
след като твоята заявка(без значение дали е вярна) толкова бавно се изпълнява, може да се допусне, че имаш доста данни => колкото и оптимална заявка да напишеш тя най-вероятно ще е доста бавна. Решението е индексиране. Не знам за какъв сървър говориш, но това няма значение. Индексирането попринцип променя много плана на изпълнение и наистина може да се полуи така, че без индекс една заявка да се изпълнява 30 мин, а с индекс 3 мин. Просто трябва да ги направиш правилно индексите.

Отговор
в отговор на AiSiktiriks #7

Re: SQL Help - SQL Experts

Zdravejte,

бих посъветвал да се смени малко логиката на таблицата Movements,
по принцип когато се прави таблица която отразява едновременно ситория и текущо състояние, To полето на текущото състояние е NULL, докато на историята е запълнено. Ако апликацията ти не е в много напреднал стадий бих те посъветвал да използваш този /стар/ трик

Отговор
в отговор на krachev #8

Re: SQL Help - SQL Experts

я пак? кога е NULL? кога не е? обясни го тоя стар трик че нещо не отлепям...

Отговор