Присоединитесь к МАКСИМАЛЬНОМУ значению одной части составного ключа - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь получить запрос для сравнения двух таблиц, ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ и нахождение любых результатов, которые не имеют совпадений в правой таблице.Проблема в том, что у меня есть составной ключ TicketNo, ItemNo и UniqueID, и мне нужно сравнивать только строки, которые имеют самый высокий UniqueID для любого заданного TicketNo.

Мне нужны данные, чтобы моя программа знала, нужно ли ее обновлятьТаблица рабочей копии и какие строки нужно обновить, если это так.

В основном я хочу вот что:

SELECT TicketNo
FROM History t1
LEFT OUTER JOIN Working t2 on 
max(t1.[UniqueID])=t2.[UniqueID] 
AND t1.[TicketNo]=t2.[TicketNo]
AND t1.[ItemNo]=t2.[ItemNo]
WHERE t2.[TicketNo] IS NULL 

Но я не могу использовать агрегирующую функцию max здесь.Я не знаю, как я могу использовать подзапрос (или потерпеть неудачу в этом CTE, но я бы предпочел подзапрос), чтобы получить только максимальный уникальный идентификатор для данного TicketNo .Я не могу присоединиться только к самому высокому уникальному идентификатору в таблице.

Мои данные выглядят так, при условии двух дубликатов:

TicketNo    UniqueID    ItemNo
15         1270662207   1
15         1184857061   1

В этом случае я хочу сначала только строка для возврата.Мне все равно, есть ли в моей рабочей таблице старые строки с TicketNo 15 или нет.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

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

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

Вот пример метода производной таблицы:

SELECT d.TicketNo FROM 
 (SELECT TicketNo, ItemNo, MAX(UniqueID) AS maxid FROM History t1 GROUP BY TicketNo, ItemNo) AS d 
 LEFT JOIN Working t2 ON d.TicketNo=t2.TicketNo AND d.ItemNo=t2.ItemNo AND d.maxid=t2.UniqueID 
WHERE t2.TicketNo IS NULL;

Для получения дополнительной информации см. Эти ссылки:

http://jan.kneschke.de/projects/mysql/groupwise-max/

http://dev.mysql.com/doc/refman/5.5/en/example-maximum-column-group-row.html

1 голос
/ 10 февраля 2012
DECLARE @History TABLE(UniqueID INT, TicketNo INT, ItemNo INT);
DECLARE @Working TABLE(UniqueID INT, TicketNo INT, ItemNo INT);

INSERT @History SELECT 15,1270662207,1
      UNION ALL SELECT 15,1184857061,1;

INSERT @Working SELECT 15,1184857061,1;

SELECT h.TicketNo, h.UniqueID
FROM 
(
    SELECT TicketNo, ItemNo, MAX(UniqueID) AS UniqueID
    FROM @History GROUP BY TicketNo, ItemNo
) AS h
LEFT OUTER JOIN 
@Working AS w
    ON h.TicketNo = w.TicketNo
    AND h.ItemNo = w.ItemNo
    AND h.UniqueID = w.UniqueID
WHERE w.TicketNo IS NULL;

Результаты:

TicketNo    UniqueID
----------- -----------
1270662207  15
0 голосов
/ 10 февраля 2012

Попробуйте использовать предложения GROUP BY и ORDER BY следующим образом:

SELECT TicketNo
FROM History t1
LEFT OUTER JOIN Working t2 on 
t1.[UniqueID]=t2.[UniqueID] 
AND t1.[TicketNo]=t2.[TicketNo]
AND t1.[ItemNo]=t2.[ItemNo]
WHERE t2.[TicketNo] IS NULL
GROUP BY t1.[TicketNo], t1.[ItemNo]
ORDER BY t1.[UniqueID] DESC
...