2013-10-04 6 views
1

Использование базы данных, в которой каждому ордеру присвоен Предмет, назначенный ему, и каждый элемент должен иметь действие «Пуск» до того, как действие «Действие» может произойти с ним, и как только это будет сделано, действие «Готово» выполненный.Неисправность при получении скрипта последним действием с использованием вложенных запросов

На одном и том же изделии может быть несколько стартов и отделок, но действие может выполняться только между действием «Старт» и «Готово».

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

SELECT 
O.ORDER_NUMBER 
--,* 
FROM 
[CUSTOMER] [C] 
JOIN 
[SITE] [S] ON C.CUSTOMER_ID=S.CUSTOMER_ID 
JOIN 
[ORDER] [O] ON S.SITE_ID=O.SITE_ID 
JOIN 
[ITEM] [I] ON O.ORDER_ID=I.ORDER_ID 
JOIN 
(SELECT 
    MAX(ACTION_ID) AS [START_ID] 
    ,A2.ITEM_ID 
FROM 
    [ACTION] [A2] 
JOIN 
    [ALLOWED_ACTION] [AA2] ON A2.ALLOWED_ACTION_ID = AA2.ALLOWED_ACTION_ID 
WHERE 
    AA2.DESCRIPTION='START' 
GROUP BY 
    A2.ITEM_ID) AS [D] ON I.ITEM_ID=D.ITEM_ID 
JOIN 
(SELECT 
    MAX(ACTION_ID) AS [FINISH_ID] 
    ,A3.ITEM_ID 
FROM 
    [ACTION] [A3] 
JOIN 
    [ALLOWED_ACTION] [AA3] ON A3.ALLOWED_ACTION_ID = AA3.ALLOWED_ACTION_ID 
WHERE 
    AA3.DESCRIPTION='FINISH' 
GROUP BY 
    A3.ITEM_ID) AS [F] ON I.ITEM_ID=F.ITEM_ID 
JOIN 
(SELECT 
    MAX(ACTION_ID) AS [LAST_ID] 
    ,A4.ITEM_ID 
FROM 
    [ACTION] [A4] 
GROUP BY 
    A4.ITEM_ID) AS [L] ON I.ITEM_ID=L.ITEM_ID 
WHERE 
(L.LAST_ID>F.FINISH_ID) 
AND 
(F.FINISH_ID>D.START_ID) 

Я принял взглянуть на How to get the 2nd highest from a table where it need to be added first in sql server in a single query? и другие подобные ему, чтобы попытаться понять это, но я не понимаю, что я делаю неправильно.

Типичный результат даст мне номер заказа, и когда я проверю действия, последним действием всегда будет финиш или он сначала начнет.

Любая помощь для меня значила бы.

+0

Если это 'величайшую-н-в-group' проблемы, вы можете попробовать [поиск по сайту] (http://stackoverflow.com/questions/tagged/greatest-n-per-group+ sql-server "[наибольший-n-per-group] + [sql-server]") для готовых решений. –

+0

Спасибо @ AndriyM, глядя через них, помогло! – Shaneis

ответ

0

Удалось найти решение этой проблемы.

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

Не уверен, что если первоначальный условный оператор работал только на части сценария или нет, но придется взять кого-то умнее меня, чтобы понять это :)

Во всяком случае, вот окончательный сценарий, работал на меня.

SELECT 
O.ORDER_NUMBER 
,LAST_ID 
,FINISH_ID 
,LAST_ID 
INTO #TEMP1 
--,* 
FROM [CUSTOMER] [C] 
JOIN [SITE] [S] ON C.CUSTOMER_ID=S.CUSTOMER_ID 
JOIN [ORDER] [O] ON S.SITE_ID=O.SITE_ID 
JOIN [ITEM] [I] ON O.ORDER_ID=I.ORDER_ID 
JOIN (SELECT 
    MAX(ACTION_ID) AS [START_ID], A2.ITEM_ID 
    FROM [ACTION] [A2] 
    JOIN [ALLOWED_ACTION] [AA2] ON A2.ALLOWED_ACTION_ID = AA2.ALLOWED_ACTION_ID 
    WHERE AA2.DESCRIPTION='START' 
    GROUP BY A2.ITEM_ID) AS [D] ON I.ITEM_ID=D.ITEM_ID 
JOIN (SELECT 
    MAX(ACTION_ID) AS [FINISH_ID], A3.ITEM_ID 
    FROM [ACTION] [A3] 
    JOIN [ALLOWED_ACTION] [AA3] ON A3.ALLOWED_ACTION_ID = AA3.ALLOWED_ACTION_ID 
    WHERE AA3.DESCRIPTION='FINISH' 
    GROUP BY A3.ITEM_ID) AS [F] ON I.ITEM_ID=F.ITEM_ID 
JOIN (SELECT 
    MAX(ACTION_ID) AS [LAST_ID], A4.ITEM_ID 
    FROM [ACTION] [A4] 
    GROUP BY A4.ITEM_ID) AS [L] ON I.ITEM_ID=L.ITEM_ID 

SELECT ORDER_NUMBER FROM #TEMP1 
WHERE LAST_ID>FINISH_ID 
AND 
FINISH_ID>START_ID 
Смежные вопросы