2016-01-20 34 views
0

我想问一下你的帮助,关于SQL Server,我的头脑中有一个gordian结。我试图用一个联合视图替换一个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的列表中,显示所有者的名称,除非代表具有约定的“超驰”(以便显示他的或公司名称)。

在上面的例子中,对于Justin Case的入门而言,它是直截了当的。他是所有者(类型0),故事结束。

当Gladys Friday进入时(她没有覆盖“DisplayName”),系统应该再次将Justin Case的姓名作为所有者返回。

在上例中,Mandy Lifeboats具有DisplayName,因此应该返回。

理想情况下,我最终将得到一个视图或类似的重要提升,以便我可以将它加入到#RaceEntries(加入汽车和联系人ID)的x000记录中以获取正确的所有者名称。

我希望我尽可能简化了这个例子,真实情况有点复杂......请让我知道我是否应该准备其他任何东西来帮助简单一点。非常感谢!

+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),所以子查询将让你每节车厢的所有所有者名称。然后,您只需将其加入cars_id字段中的ownership表。如果在ownership表中有显示名称,则显示该名称,否则显示车主名称。

+0

这看起来很有希望,我会继续尝试。将回报,谢谢! – ExternalUse