2009-11-05 4 views
3

Можно ли отображать все, кроме первой строки, из таблицы в sql server 2005? У меня есть эти данные:Как отобразить все, кроме первой строки таблицы?

--------------------------------- 
| ID | Name    | 
--------------------------------- 
| 1 | John Smith   | 
| 2 | John Doe   | 
| 3 | John Thatcher  | 
--------------------------------- 

В моем запросе мне нужно, чтобы быть в состоянии получить «John Doe» и «Джон Тэтчер». Мне не нужен столбец «ID», который будет отображаться, так что я не могу использовать ROW_NUMBER здесь нравится следующим образом:

select Name from Customers where ROW_NUMBER() over (order by Id)>1 

Пожалуйста совет.

спасибо.

UPDATE: Разъяснение: Я хотел бы мой запрос, возвращающий только имя столбца, но я не могу использовать табличные выражения, потому что я использую запрос как часть конкатенации:

select stuff((select ', '+pfn.FullName from PlaintiffsFullNameView pfn where pfn.SuitId=s.Id for xml path('')),1,1,'') as "CoPlaintiffs" 

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

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

+0

Любопытно, что вы делаете с результатами запроса, которые возвращают идентификатор или Row_Number, вызывают проблему? Большинство визуальных дисплеев могут в случае необходимости пропускать эти поля (редко показывать идентификатор, но использовать их как ссылку.). – JeffO

+0

просто потому, что материал (.... для пути xml ...) будет включать в себя другие столбцы в полученном xml, который разбивает конкатенацию – Valentin

ответ

13
SELECT Name 
FROM (
     SELECT Name, ROW_NUMBER() OVER (ORDER BY id) AS rn 
     FROM Customers 
     ) q 
WHERE rn > 1 
ORDER BY 
     id 

Update:

Из ваших объяснений:

SELECT Suit.*, 
     FirstPlantiff.*, 
     (
     SELECT cp.Name AS [text()] 
     FROM Plantiff cp 
     WHERE cp.id <> FirstPlantiff.id 
       AND cp.SuitID = Suid.ID 
     ORDER BY 
       cp.id 
     FOR XML PATH('') 
     ) AS Coplantiffs 
FROM Suit 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM Plantiff p 
     WHERE p.SuitID = Suit.ID 
     ORDER BY 
       p.id 
     ) FirstPlantiff 
+0

+1 Хорошая идея объединить других истцов в столбце – Andomar

+0

+5 (ah, только +1 - разрешено), хороший ответ, спасибо – Valentin

8
SELECT Name 
FROM Customers 
WHERE ID <> (SELECT TOP 1 ID 
       FROM Customers 
       ORDER BY ID) 

Или так как Id никогда не меняется вы могли бы просто сделать где ID <> 1

1

Ваш запрос должен работать, нет необходимости в Id, который будет использоваться для использования в условиях WHERE.

Также, возможно, this page может помочь.

0

Попробуйте эти

Решение 1:

select name 
from @tbl 
where id <> 1 

Решение 2:

select top(select count(name) -1 from @tbl) name 
from @tbl 
order by id desc 
3

Ваш запрос с ROW_NUMBER выдает ошибку, потому что вы не можете использовать ROW_NUMBER в ИНЕКЕ.Таким образом, вы должны были бы другой подзапрос:

select stuff((
    select ',' + FullName 
    from (
     select pfn.FullName, row_number() over (order by pfn.id) as rn 
     from @suits s 
     inner join @plaintiffs pfn on s.id = pfn.SuitId 
    ) sub 
    where rn <> 1 
    for xml path('') 
), 1, 1, '') subsub 

В качестве альтернативы, вы можете выбрать идентификатор первой строки в подзапрос:

select stuff((
    select ',' + pfn.FullName 
    from @suits s 
    inner join @plaintiffs pfn on s.id = pfn.SuitId 
    where s.id = 1 
    and pfn.id not in (
     select min(id) from @plaintiffs where SuitId = s.id) 
    for xml path('') 
), 1, 1, '') sub 

Вот сегмент кода для генерации тестовых данных:

declare @suits table (id int identity, CaseName varchar(max)) 
insert into @suits (CaseName) values ('The People v.s. Donald Duck') 
declare @plaintiffs table (id int identity, 
    SuitId int, FullName varchar(max)) 
insert into @plaintiffs (SuitId,Fullname) 
select 1, 'John Smith' 
union all select 1, 'John Doe' 
union all select 1, 'John Thatcher'