如何显示除第一个表行之外的所有行?

时间:2009-11-05 13:56:37

标签: sql sql-server sql-server-2005

是否可以在sql server 2005中显示表中除第一行以外的所有行? 我有这些数据:

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

在我的查询中,我需要能够得到'John Doe'和'John Thatcher'。我不需要显示“ID”列,所以我不能在这里使用ROW_NUMBER,如下所示:

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

请建议。

谢谢。

更新: 澄清:我希望我的查询只返回Name列,但我不能使用表表达式,因为我使用查询作为字符串连接的一部分:

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

现在我需要转换此查询以连续方式返回除第一个原告之外的所有内容。

更新2: 抱歉搞砸了解释,让我重新尝试一下: 我有一张西装桌和一张原告桌。 (一对多) 我要求显示每个套装与所有coplaintis连接。 “Coplaintiff”是第一套诉讼原告。我可以连接所有原告并将它们与相应的套装数据一起显示(全部在一行中),但我无法弄清楚如何连接所有的coplaintis并将它们显示为行列中的字符串。

6 个答案:

答案 0 :(得分:13)

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

<强>更新

根据你的解释:

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

答案 1 :(得分:8)

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

或者因为ID永远不会改变,所以你可以做ID&lt;&gt; 1

答案 2 :(得分:3)

使用ROW_NUMBER的查询会出错,因为您无法在WHERE子句中使用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

或者,您可以选择子查询中第一行的ID:

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'

答案 3 :(得分:1)

您的查询应该有效,不需要返回Id,以便在WHERE条件中使用它。

此外,也许this page可以提供帮助。

答案 4 :(得分: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

答案 5 :(得分:0)

SELECT * FROM Customers
EXCEPT SELECT TOP 1 * FROM Customers