Как сгруппировать этот запрос, чтобы он вел себя правильно? - PullRequest
0 голосов
/ 10 июля 2009

У меня есть таблица с названием Stock и еще одна с именем Listed, в таблице Stock есть код состояния, который указывает, когда что-то находится в начале очереди товаров на складе - я хочу найти последний добавленный товар. и задайте для этого состояния статус «начало очереди».
Например, чтобы получить все перечисленные элементы, а затем заказать их по одному из последних перечисленных Я бы использовал этот запрос:

SELECT SKU FROM Stock
INNER JOIN Listed
ON Listed.ListingID = Stock.ListingID
WHERE Stock.StatusCode = 2
ORDER BY Listed.ListDate

Однако я хочу найти все элементы в моей таблице акций, которые должны быть в начале очереди - т.е. имеют StatusCode 1, где эти элементы не имеют SKU с StatusCode 1
например У меня есть несколько элементов с различными ProductCodes в таблице Stock, но они могут иметь StatusCodes 1 и 2 - где 1 указывает на первый элемент в очереди, а 2 указывает на остальные элементы с тем же ProductCode.

Как мне написать свой запрос, чтобы установить все те элементы, для которых нужен StatusCode 1, где что-либо с данным ProductCode не имеет ничего с кодом состояния 1?
Я хочу установить для последнего добавленного элемента Stock, указанного в списке, с кодом состояния 1, поскольку мне необходимо сбросить их все на 2 в рамках процесса сопровождения и восстановить элемент «перед очередью».

Последнее добавленное: ListDate
StatusCode: 1 (передняя часть очереди), 2 (другие товары на складе с тем же кодом продукта)


Вот некоторые примеры данных

Стол акций

SKU    ProductCode    StatusCode  
1      111111         1  
2      111111         2  
3      222222         1  
4      222222         2  
5      333333         2  
6      333333         2  

Таблица в списке

ListID    SKU    ListDate
01        1      01/01/2009
02        2      02/01/2009
03        3      03/01/2009
04        4      04/01/2009
05        5      05/01/2009
06        6      06/01/2009

В таблице запасов SKU 6 с ProductCode 333333 есть два элемента с одинаковым StatusCode, я хочу установить элемент с самой последней ListDate из таблицы в списке в StatusCode 1. Это будет относиться ко всем другим случаям, где мне нужно больше всего Недавно добавленный элемент имеет этот StatusCode

Ответы [ 3 ]

0 голосов
/ 10 июля 2009
UPDATE S1
SET S1.StatusCode = 1
FROM Stock S1
LEFT JOIN Stock S2
  ON (S1.ProductCode = S2.ProductCode
      AND S2.StatusCode = 1)
JOIN Listed L1
  ON (S1.SKU = L1.SKU)
WHERE S2.StatusCode IS NULL
 AND L1.ListDate =
 ( SELECT MIN(L2.ListDate)
     FROM Listed L2
    WHERE L1.SKU = L2.SKU )

Иногда вы говорите, что хотите «найти» такие элементы (я думаю, это будет SELECT), а иногда вы говорите, что хотите «установить» их код состояния - я выполнил последнюю операцию, потому что она кажется лучше соответствует проблеме, которую вы описываете, откуда ОБНОВЛЕНИЕ.

Кроме того, неясно, что вы хотите делать, когда несколько других удовлетворительных элементов имеют одинаковые даты, и поэтому невозможно однозначно определить самую последнюю; может быть, другие ограничения в вашей ситуации делают это невозможным? Здесь я устанавливаю все их коды состояния, конечно, было бы также возможно установить ни один из них или несколько произвольно выбранный (упорядочив по некоторым другим критериям?).

0 голосов
/ 15 июля 2009

Это вариация на общую тему. Приложение, похожее на этот тип запроса, используется для работы с дублирующимися строками. В этом senario вы можете удалить все, кроме одной строки набора.

Этот запрос решает вашу проблему:

ОБЪЯВИТЬ @Stock AS TABLE (SKU Bigint, ProductCode Bigint, StatusCode Bigint)

INSERT INTO @Stock VALUES (1,111111,1) INSERT INTO @Stock VALUES (2,111111,2) INSERT INTO @Stock VALUES (3 222 222,1) INSERT INTO @Stock VALUES (4,222222,2) INSERT INTO @Stock VALUES (5,333333,2) INSERT INTO @Stock VALUES (6,333333,2)

ОБЪЯВИТЬ @Listed AS TABLE (ListID Bigint, SKU Bigint, ListDate DateTime)

INSERT INTO @Listed VALUES (1,1, 01/01/2009) INSERT INTO @Listed VALUES (2,2, '02/01/2009') INSERT INTO @Listed VALUES (3,3, '03 / 01/2009 ') INSERT INTO @Listed VALUES (4,4, '04/01/2009') INSERT INTO @Listed VALUES (5,5, '05/01/2009') INSERT INTO @Listed VALUES (6,6, '06 / 01/2009 ')

ОБНОВЛЕНИЕ @Stock SET StatusCode = 1 ОТ @Stock AS T1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ @ Внесено в список T2 ON T1.SKU = T2.SKU ГДЕ T1.SKU IN

(ВЫБЕРИТЕ ТОП 1 T3.SKU ОТ @Stock AS T3 ВНУТРЕННЕЕ СОЕДИНЕНИЕ @ Внесено в список T4 ON T3.SKU = T4.SKU AND T3.ProductCode = T1.ProductCode ORDER BY ListDate)

И ProductCode IN (ВЫБЕРИТЕ DISTINCT ProductCode ОТ @Stock AS S1 ГДЕ НЕ ВХОДИТ (ВЫБЕРИТЕ DISTINCT StatusCode ОТ @Stock AS S2, ГДЕ S2.ProductCode = S1.ProductCode))

0 голосов
/ 10 июля 2009

Это вариант pick-a-winner ... это pick-all-losers.

Вот суть. Есть несколько записей с общим значением, но одна запись особенная - это победитель. Остальные записи с таким общим значением являются проигравшими.

Например, этот запрос выбирает победителя (по имени) у Клиентов, используя самый низкий идентификатор. Это делается путем определения победителя в подзапросе.

SELECT *
FROM Customers c1
WHERE 
(
SELECT Min(CustomerID)
FROM Customers c2
WHERE c2.Name = c1.Name
GROUP BY c2.Name
) =  c1.CustomerID

Тогда выбор проигравших - это простое изменение:

SELECT *
FROM Customers c1
WHERE 
(
SELECT Min(CustomerID)
FROM Customers c2
WHERE c2.Name = c1.Name
GROUP BY c2.Name
) !=  c1.CustomerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...