Инструкция SQL Server Max возвращает несколько результатов - PullRequest
1 голос
/ 26 октября 2010

При запросе двух таблиц (t1, t2) и использовании оператора MAX для столбца в t2, SQL возвращает несколько записей.

Это происходит потому, что я также запрашиваю другую информацию из t2, которая состоит из уникальногозаписи.

Пример упрощенной таблицы

t1.number       t2.number_id       t2.sync_id       t2.text
1               1                  1                'My problem is 
1               1                  2                That
2               2                  3                Multiple entries
2               2                  1                Are
2               2                  2                Returned'

При использовании

SELECT t1.number, max(t2.sync_id), convert(varchar(100),t2.text) 
FROM t1, t2 
WHERE t1.number = t2.number_id 
GROUP BY t1.number, convert(varchar(100),t2.text)

я получаю несколько записей вместо строк 2 и 5 из таблицы примеров.

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

Вам необходимо удалить convert(varchar(100),t2.text) из GROUP BY t1.number, convert(varchar(100),t2.text).Теперь вы группируете по двум критериям, когда хотите просто группировать по t1.number.

. Также вас может заинтересовать, как получить весь текст в столбце t2.text в одну строку.Если это так, посмотрите здесь: http://databases.aspfaq.com/general/how-do-i-concatenate-strings-from-a-column-into-a-single-row.html

1 голос
/ 26 октября 2010

Предполагая, по крайней мере, SQL 2005, чтобы вы могли использовать CTE :

;with cteMaxSync as (
    select t1.number, max(t2.sync_id) as MaxSyncId
        from t1
            inner join t2
                on t1.number = t2.number_id
        group by t1.number
)
select c.number, c.MaxSyncId, convert(varchar(100),t2.text) 
    from cteMaxSync c
        inner join t2
            on c.number = t2.number_id
                and c.MaxSyncId = t2.sync_id
0 голосов
/ 26 октября 2010

Стандартный подход sql

SELECT
     t1.number, 
     t2.sync_id, 
     convert(varchar(100),t2.text) 
FROM
    t1 
    INNER JOIN  t2 
    ON t1.number = t2.number_id 
    INNER JOIN (
       SELECT Max(t2.synch_id) synch_id, t1.number) 
       FROM   t1 
            INNER JOIN  t2 
            ON t1.number = t2.number_id ) max
    ON t1.number = max.number and 
       t2.synch_id = max.synch_id
...