如何获取值列表以及所有相关信息?

时间:2013-02-08 22:42:56

标签: sql

我在SQL服务器数据库中有以下表格:

[ANIMALS]            [COLORS]
ID | NAME            ID | NAME
 1   Cow              1   Blue
 2   Chicken          2   Red
 3   Pig              3   Green
 4   T-Rex            4   Pink
                      5   Orange

  [RELATIONSHIPS]         
ANIMAL ID | COLOR ID  
    1          3
    1          2
    1          5
    2          1
    3          1
    3          4
    4          1
    4          2
    4          5

我正在尝试编写一个SQL查询,它将返回动物列表及其各自的颜色。我试图实现的目标如下:

  ANIMAL NAME     COLORS
     Cow            Green/ Red / Orange
     Chicken        Blue
     Pig            Blue/ Pink
     T-Rex          Blue/ Red/ Orange              

我已经有了一个用户定义的函数,它将创建一个名为udf_Delimit_Colors(@animalID)的分隔字符串(“color / color / etc.”) - @animalID是该UDF中唯一的参数。

我只能通过传入一个动物ID返回一行,现在我很难知道如何在不传递任何ID的情况下实现我的目标。

可以在以下链接中找到分隔的SQL查询: https://sites.google.com/site/sqlblindman/creatingcomma-delimitedstrings

+代表编写它的人。

我还在努力,所以如果我搞清楚,我会发布答案。 提前感谢您的意见。

1 个答案:

答案 0 :(得分:2)

根据您的语法,我假设SQL Server为数据库。您可以通过以下方式连接字符串:

SELECT a.name,
  LEFT(colors , LEN(colors)-1) colors 
FROM animals a
CROSS APPLY
(
    SELECT c.name + ' / '
    FROM colors c
    left join relationships r
      on c.id = r.[COLOR ID]
    where a.id = r.[ANIMAL ID]
    FOR XML PATH('')
) m (colors)

请参阅SQL Fiddle with Demo

或者:

select a.name,
  STUFF((SELECT distinct ' / ' + c.name
         from colors c
         left join relationships r
           on c.id = r.[COLOR ID]
         where a.id = r.[ANIMAL ID]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,2,'') colors
from animals a;

请参阅SQL Fiddle with Demo

结果是:

|    NAME |                COLORS |
-----------------------------------
|     Cow | Red / Green / Orange  |
| Chicken |                 Blue  |
|     Pig |          Blue / Pink  |
|   T-Rex |  Blue / Red / Orange  |