SQL 2005的连接结果(sql 2005 join results)

2019-11-02 04:46发布

HI,

使用Microsoft SQL Server 2005:

我有一个表“测试”:

ID,link_id,名称

1个11 TEST1

2个11 TEST2

3个11 TEST3

4个12 TEST4

有没有一种方法来查询这一点,并返回由“link_id”分组的结果,与名字注册了?

例如,

SELECT link_id,名字从测试WHERE ???????

结果:

link_id,姓名(或名称)

11 TEST1,TEST2,TEST3

12个TEST4

Answer 1:

这样做的黑箱方式是用CROSS APPLY和FOR XML PATH:

declare @t table (id int, link_id int, name varchar(max))
insert into @t select 1, 11, 'test1'
union all select 2, 11, 'test2'
union all select 3, 11, 'test3'
union all select 4, 12, 'test4'

select b.link_id, d.link_names
from (
    select distinct link_id
    from @t a
) b
cross apply (
    select name + ', ' as [text()]
    from @t c
    where b.link_id = c.link_id
    for xml path('')
) d (link_names)

对于每一行,一个CROSS APPLY执行应用子查询。 在这种情况下,查询都称为两次,link_id 11和12的子查询,然后滥用FOR XML操作的字符串相加。

如果您运行的查询时,它会打印:

11   test1, test2, test3, 
12   test4, 


Answer 2:

递归CTE例如:

declare @t table (id int
                , link_id int
                , [name] varchar(10) )


insert @t
      select 1,11,'test1'
union select 2,11,'test2'
union select 3,11,'test3'
union select 4,12,'test4'

;with rnCTE
AS
(
        select * 
               ,ROW_NUMBER() OVER (PARTITION BY link_id
                                   ORDER BY  id
                                   ) AS rn
               ,ROW_NUMBER() OVER (PARTITION BY link_id
                                   ORDER BY  id desc
                                   ) AS rd
        from @t
)
,recCTE
AS
(       select link_id
               ,cast([name] as varchar(max)) as [name]
               ,rn
               ,rd
        from rnCTE
        where rn = 1

        UNION ALL

        select c.link_id
               ,c.[name] + ', ' + t.name as [name]
               ,t.rn
               ,t.rd
        from recCTE c
        join rnCTE  t
        on   t.link_id = c.link_id
        and  t.rn      = c.rn + 1
)
select * from recCTE 
where rd = 1 
order by link_id


Answer 3:

看看这篇文章

http://www.sqlprof.com/blogs/sqldev/archive/2008/03/31/how-to-list-multiple-rows-of-data-on-same-line.aspx

基本上你需要创建它会返回一个函数test1, test2, test3一部分。 即通过设置变量来完成。 再加上一个独特的名单link_id的,你有你的输出。



Answer 4:

您可以使用CTE的(通用表表达式)在数据库级别来做到这一点。 他们是有点棘手,先是用工作,但它们可以被用来解决一些有趣的问题。 MSDN链接



Answer 5:

在纯SQL,最好的办法是写一个标值函数,将集团所有的名字,就像这样:

DECLARE @Names TABLE (id INT IDENTITY NOT NULL, name NVARCHAR(255))
INSERT INTO @Names SELECT name FROM test WHERE link_id = @link_id

DECLARE @ConcatString NVARCHAR(MAX)

WHILE EXISTS(SELECT NULL FROM @Names)
BEGIN
  SELECT @ConcatString = @ConcatString + ', ' + (SELECT TOP 1 name FROM @Names)
  DELETE FROM @Names WHERE id = (SELECT TOP 1 id FROM @Names)
END

RETURN @ConcatString

然后,你可以这样做:

SELECT link_id, dbo.FunctionName(link_id)
FROM test
GROUP BY link_id


Answer 6:

首先创建一个功能。

Create FUNCTION [dbo].[getname]

( - 添加参数的功能,在这里@link_ID为INT)返回值VARCHAR(1000)AS BEGIN - 声明返回变量此申报@names为varchar(1000)

-- Add the T-SQL statements to compute the return value here
SELECT @names = Coalesce(@names + ',', '') + Convert(varchar(1000), name)
from tblTableName
where link_ID = @link_ID

-- Return the result of the function
RETURN @names

结束

然后

select link_ID, GetName(link_ID) from tblOctHotelImages group by Link_ID, GetName(link_ID)

你会得到的结果。



文章来源: sql 2005 join results