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

3

在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

请给予建议。

谢谢。

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

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

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

更新2: 抱歉之前的解释有点混乱,让我再试试: 我有一个诉讼表和一个原告表。(一对多) 我要求每个诉讼都显示出所有共同原告的连接。 “共同原告”是除第一个原告外的其他人。我可以将所有原告连接起来,并将其与相应的诉讼数据(全部在一行内)一起显示,但我无法想出如何将所有共同原告连接起来并将它们作为字符串显示在一列中。


好奇,如果返回ID或行号引起问题,你在处理查询结果时要做什么?大多数可视化显示可以根据需要省略这些字段(通常不显示ID,但用作参考)。 - JeffO
仅仅因为使用 stuff(....for xml path...) 会将其他列包含在生成的 XML 中,这会破坏连接操作。 - Valentin V
6个回答

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

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

或者,由于ID从不改变,您可以只使用where ID <> 1


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'

1
SELECT * FROM Customers
EXCEPT SELECT TOP 1 * FROM Customers

1

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

另外,也许这个页面可以帮助你。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接