2016-01-20 3 views
0

Я бы хотел попросить вашу помощь с гордианным узлом в голове в отношении SQL Server. Я пытаюсь заменить UDF объединенным представлением, но я изо всех сил пытаюсь получить представление, чтобы вернуть то, что мне нужно. Немного умного порядка или так может хорошо сделать трюк, я застрял.SQL Server: замените UDF на объединенный вид

К сожалению, я не могу подписаться на SQL скрипку в данный момент, так что я должен представить тестовые данные здесь:

CREATE TABLE #Contacts 
(
    ID INT NOT NULL IDENTITY, 
    Firstname VARCHAR(50) NULL, 
    Lastname VARCHAR(50) NULL 
) 
GO 

CREATE TABLE #Cars (ID INT NOT NULL IDENTITY, CarModel VARCHAR(50) NULL) 
GO 

CREATE TABLE #Ownership 
(
    Contacts_ID INT NOT NULL, 
    cars_id INT NOT NULL, 
    ownership_type TINYINT NOT NULL, 
    DisplayName VARCHAR(50) NULL 
) 
GO 

CREATE TABLE #Races(ID INT NOT NULL IDENTITY, RaceName VARCHAR(50) NOT NULL) 
GO 

CREATE TABLE #RaceEntries 
( 
    ID INT NOT NULL IDENTITY, 
    Races_ID INT NOT NULL, 
    Contacts_ID INT NOT NULL, 
    cars_id INT NOT NULL 
) 

INSERT [#Contacts] ([Firstname], [Lastname]) 
SELECT 
'Justin', 'Case' UNION ALL SELECT 
'Gladys', 'Friday' UNION ALL SELECT 
'Mandy', 'Lifeboats' 
GO 

INSERT [#Cars] ([CarModel]) 
VALUES ('Great Car') 
GO 

INSERT [#Races] ([RaceName]) 
VALUES ('A Car Race') 

INSERT [#Ownership] ([Contacts_ID], [cars_id], [ownership_type], [DisplayName]) SELECT 
1, 1, 0, NULL UNION ALL SELECT 
2, 1, 1, NULL UNION ALL SELECT 
3, 1, 1, 'Mandy Lifeboats Racing Team' 

INSERT [#RaceEntries] ([Races_ID], [Contacts_ID], [cars_id]) SELECT 
1, 1, 1 UNION ALL SELECT 
1, 3, 1 UNION ALL SELECT 
1, 2, 1 

Что я хотел бы:

SELECT 
    [cars_id], mvo.Ownername 
FROM 
    [#RaceEntries] -- join a view that returns the ownername 
LEFT OUTER JOIN 
    #myViewOwnername AS mvo ON mvo.Contacts_ID = [#RaceEntries].[Contacts_ID] AND mvo.Cars_ID = [#RaceEntries].[cars_id] 

вопрос здесь что каждый автомобиль имеет только одного владельца (тип 0 в собственности). Он может иметь другие контакты в качестве представителей.

Обычно в списках для #RaceEntries отображается имя владельца, если у представителя нет согласованного «переопределения» (чтобы отображалось его или название компании).

В приведенном выше примере для позиции Юстина Кейс это прямолинейно. Он владелец (тип 0), конец рассказа.

Когда Gladys Friday входит (у нее нет переопределения «DisplayName»), система должна снова вернуть имя Justin Case в качестве владельца.

В последнем примере спасательные шлюпки Mandy имеют DisplayName и поэтому должны быть возвращены.

В идеале я получаю вид или аналогичный, что делает тяжелый подъем, так что я могу присоединиться к нему к x000 записей из #RaceEntries (присоединился к автомобилю и идентификатору контакта), чтобы вернуть правильное имя владельца.

Надеюсь, я упростил пример как можно больше, реальная вещь немного сложнее ... Пожалуйста, дайте мне знать, если я должен подготовить что-нибудь еще, чтобы облегчить помощь. Большое спасибо!

+1

@marc_s Спасибо за редактирование! – ExternalUse

ответ

1

Я думаю, что это может быть то, что вы ищете:

select [#Ownership].Contacts_ID, 
    [#Ownership].Cars_ID, 
    coalesce([DisplayName], CarOwners.ContactName) Ownername 
into #myViewOwnername 
from [#Ownership] 
join 
    (
    select [cars_id], Contacts_ID, [#Contacts].Firstname + ' ' + [#Contacts].Lastname ContactName 
    from [#Ownership] 
    join [#Contacts] 
    on [#Ownership].Contacts_ID = [#Contacts].ID 
    where ownership_type = 0 
    ) CarOwners 
on [#Ownership].cars_id = CarOwners.cars_id 

Автомобиль имеет один прямой владелец (тип 0), так что суб-запрос получит вам все имена владельца каждого автомобиля. Затем вы просто присоединитесь к этой таблице ownership по полям cars_id. Если отображается отображаемое имя в таблице ownership, вы показываете, что в противном случае вы укажете имя владельца автомобиля.

+0

Это выглядит многообещающе, и я пойду дальше и попробую. Откликнется, спасибо! – ExternalUse

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