2016-01-14 2 views
2

Я хочу создать представление, в котором перечислены все дни рождения всех людей. Допустим, я хочу «развернуть» таблицу.Как расширить таблицу sql?

У меня есть стол с идентификатором атрибутов и днем ​​рождения. У меня есть функция FuncBirthdays, которая принимает идентификатор и день рождения, а затем перечисляет все дни рождения до текущей даты. Например:

SELECT * FROM FuncBirthdays (123, '01 .01.2014 ');

Result: 
123; '01.01.2014' 
123; '01.01.2015' 
123; '01.01.2016' 
// Current date is 14.01.2016, so the list stops here. 

Теперь я хочу создать представление со всеми днями рождения всех лиц в таблице Person.

SELECT * 
FROM 
Person 
INNER JOIN 
(SELECT * FROM FuncBirthdays(Person.ID, Person.Birthday)) FB 
ON Person.ID = FB.ID 

Сообщение об ошибке в MS SQL Server 2012 Studio заключается в том, что Person.ID и Person.Birthday не связаны.

Я предполагаю, что этот путь сталкивается с тем, как делаются JOINS. Какие SQL-концепции можно использовать для расширения таблицы? Каждый набор данных в Person генерирует переменное количество наборов данных на выходе. В настоящее время я решил эту проблему с помощью функции C# .net, которая собирает данные вручную. Есть ли чистый путь SQL?

Благодаря

Martin

+0

Вы можете вызвать табличные значения функции из ЕКОМ с помощью [оператор APPLY]. @DMayuri предоставил отличный пример ниже. –

ответ

3

"Сообщение об ошибке на сервере MS SQL 2012 Студия является то, что Person.ID и Person.Birthday развязаны."

Из-за того, что вы пытаетесь получить доступ к человеку в результирующем наборе Join, который не может быть доступен. В этом случае вам нужно использовать крест, как мне известно. Пожалуйста, попробуйте следующий запрос

SELECT * FROM Person p 
CROSS APPLY 
(
    SELECT * FROM FuncBirthdays(p.ID, p.Birthday) 
) FB 
WHERE p.ID = FB.ID 
+0

Вы можете сократить это: * CROSS APPLY FuncBirthdays (p.ID, p.Birthday) AS FB *. –

+0

Его правильный ответ, спасибо большое :) –

0
With CTE1 (ID, Birthday) AS 
(
    SELECT * FROM FuncBirthdays(p.ID, p.Birthday) 
) 
SELECT * 
FROM CTE1, Person p 
WHERE p.ID = CTE1.ID 
+0

В CTE нет ссылки на таблицу Person. Его проблема связана с функцией «День рождения». Но я мог бы заменить функцию в примере DMayuri нормальным SQL Stmnt. –

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