0

我在 SQL Server 数据库中有以下表:

[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 中的唯一参数。

我只能通过传入一个animalID返回一行,现在我很困惑如何在不传入任何ID的情况下实现我的目标。

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

+代表写它的人。

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

4

1 回答 1

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

或者:

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

结果是:

|    NAME |                COLORS |
-----------------------------------
|     Cow | Red / Green / Orange  |
| Chicken |                 Blue  |
|     Pig |          Blue / Pink  |
|   T-Rex |  Blue / Red / Orange  |
于 2013-02-08T22:53:58.360 回答