2010-03-11 5 views
1

Как с этим обращаться? У меня есть 3 строки так:Помощь по SQL-запросам

ID   THREAD   POST 
1   1    Hello World 
2   2    Hello galaxy 
3   2    Hello people 

мне нужно вернуться ID, тему и сообщение один раз для каждого потока только с использованием самого низкого ID.

что-то вроде:

SELECT * FROM table WHERE THREAD DISTINT AND ID = MIN(ID) 

Edit: Для того, чтобы быть более ясным в этом примере он должен возвращать только строки для 1 и 2, так как 3 не самый низкий ID с Нить 2

Edit 2: она должна возвращать обе строки 1 и 2.

+0

какую базу данных вы используете? – beny23

ответ

3

в SQL Server 2005 и далее:

SELECT t.Id, t.Thread, t.Post 
FROM 
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY Thread ORDER BY Id) as RowNumInThread 
FROM table 
) t 
WHERE t.RowNumInThread = 1 
; 

или

SELECT t.* 
FROM 
(
    SELECT Min(Id) as MinId 
    FROM table 
    GROUP BY Thread 
) tmin 
JOIN 
table t ON t.Id = tmin.Id 
; 
+0

необходимо возвращать ID, нить и сообщение после ** для каждого потока только с использованием самого низкого идентификатора ** –

+0

Да, это то, что делает мой запрос. Для каждого раздела Threads верните строку с параметром RowNumInThread равным 1. –

+0

И для второго запроса я группирую Thread, поэтому подзапрос возвращает любой ID, который является минимальным для группы. Он очень похож на данные выборки, что Id является уникальным полем, поэтому мне не нужно возвращать Thread из подзапроса. –

2
select id, thread, post 
from t 
inner join (
select min(id) 
from t 
group by thread) subq on t.id = subq.id 
1

Вы можете попробовать что-то вроде

SELECT t.* 
FROM Table t INNER JOIN 
     (
      SELECT MIN(ID) MINID, 
        Thread 
      FROM Table 
      GROUP BY Thread 
     ) sub ON t.ID = sub.MINID 
       AND t.Thread = sub.Thread 
+0

Typo ... вы не имеете в виду tempdb.Thread, вы имеете в виду t.Thread. Ошибка Intellisense Я угадываю ... –

+0

Thanx, Sql Server 2008 Intellisense может быть и хорошим, и плохим X-) –