2013-02-08 2 views
0

У меня есть следующие таблицы в базе данных на 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) - - @animalID - единственный параметр внутри этого UDF.

Я могу вернуть только одну строку, пройдя в animalID, и теперь я в тупике, как бы я мог достичь своей цели, не пропуская ни одного идентификатора.

разделителями SQL Query можно найти по следующей ссылке: https://sites.google.com/site/sqlblindman/creatingcomma-delimitedstrings

+ респ с человеком, который написал ее.

Я все еще работаю над этим, так что, если я выясню это, я отправлю ответ. Заранее благодарим за ввод.

+1

, что rdbms вы используете? – Taryn

ответ

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 | 
+0

nice union CROSS APPLY + XML PATH.Marked +1 –

+0

спасибо bluefeet. довольно рад ответ помощник – sQuijeW

+0

@sQuijeW вы очень желанны. :) – Taryn

Смежные вопросы