将3个SQL SELECT合并为1

时间:2011-04-13 14:31:01

标签: sql sql-server sql-server-2005 tsql stored-procedures

*更新*

抱歉!我有点忙,匆忙,所以没有正确清理它。

基本上,3个问题都与用户细节有关。我正在为新客户端更新站点,我受当前数据库结构的限制。因此,我的目标是尝试在一个db calll而不是3个单独的calll中获取所有这些信息,因为这似乎是两者中最有效的方式。

我希望比我聪明的人可能知道一些忍者动作可以一次性找回这个。在发布之前我真的应该花更多的时间自己尝试一下。

感谢您的时间。


公共值是@dealerId - 这是一个int值。

由于

    SELECT TOP(100) PERCENT dbo.ReferenceItems.Title 
    FROM dbo.AdvertiserLanguageLink 
    INNER JOIN dbo.ReferenceItems 
    ON dbo.AdvertiserLanguageLink.LanguageId = dbo.ReferenceItems.Id
    WHERE (dbo.AdvertiserLanguageLink.AdvertiserId = @dealerId) 
    ORDER BY dbo.ReferenceItems.Title



    SELECT TOP (100) PERCENT dbo.AircraftTypes.AircraftTypeDescription, dbo.AircraftTypes.AircraftTypeId 
    FROM dbo.AdvertiserAircraftTypeLink 
    INNER JOIN dbo.AircraftTypes 
    ON dbo.AdvertiserAircraftTypeLink.AircraftTypeId = dbo.AircraftTypes.AircraftTypeId 
    WHERE (dbo.AdvertiserAircraftTypeLink.AdvertiserId = @dealerId) 
    ORDER BY dbo.AircraftTypes.SortSequence



    SELECT TOP (1) dbo.Addresses.Country, dbo.Addresses.Telephone1 
    FROM dbo.AdvertiserAddressLink 
    INNER JOIN dbo.Addresses 
    ON dbo.AdvertiserAddressLink.AddressId = dbo.Addresses.Id 
    WHERE (dbo.AdvertiserAddressLink.AdvertiserId = @dealerId) 
    AND (dbo.Addresses.AddressType = 1 OR dbo.Addresses.AddressType = 0) 
    ORDER BY dbo.Addresses.Sequence

2 个答案:

答案 0 :(得分:5)

您不能/不应该将它们合并。

您正在从所有3中的不同表中选择非常不同的数据。看起来它们完全不相关。您期望“组合”结果集看起来像什么?您正在整理书籍,飞机和电话信息吗?

你的目标究竟是什么?如果你告诉我们,我们可以给你一个不同的(正确的)路径。

答案 1 :(得分:1)

我只是在这里做推断,但你要么...... 1.只是想让代码更简洁 2.希望输出具有同意签名(相同字段等)。

如果是1.,我会保留您的代码。每个查询都是不同的,并使用IF语句将它们分开,这使得它可读并且显而易见,有三个执行路径。

对于自动化部分程序员工作的数据绑定框架,通常需要后者。如果是这种情况,我仍然会将代码留给IF语句。如果你然后显式地将每个字段CAST到相同的类型(例如INT,或VARCHAR(256)等),然后确保每次都使用相同的字段名称(例如ID或Name等),那么你将为每个执行路径获取相同的签名。

修改

我仍然不完全确定你想要达到的目标,更具体地说,你所面临的问题。

如果您只是尝试执行一次数据库调用,并获取三组数据,则使用3 SELECT语句创建存储过程就可以完成此操作。根据您访问数据库的方式,您应该能够通过三个记录集进行迭代。

所以,我怀疑你面临的问题根本不是SQL相关的,而是在你的应用程序中。你用的是哪种语言?你目前如何访问记录集?当SP返回3个记录集时,您面临哪些问题?等等...