0

サブクエリなしでこのSPを書き直す方法はありますか?基本的に、I.RemarkIdがnullになることがあります。私は、左結合または左外部結合を使用しようとしていました。常にflightinfoから行を返し、I.RemarkIdがnullでない場合はコメントを返し、I.remarkIdがnullの場合はコメント列にnullを返します。

ALTER PROCEDURE [dbo].[Peach_GetFlightInfoForRoute]
    @FlightDate datetime,   
    @Origin nvarchar(3),
    @dest nvarchar(3),
    @Lang nvarchar(2)
AS
SELECT 
     I.FlightNumber
    ,FlightDate
    ,STD
    ,(select [Message] FROM FlightRemarkDetail WHERE RemarkId = I.RemarkId WHERE LangCode = @Lang) As [Remark]
FROM 
     [FlightInfo] as [I]
JOIN
     [FlightNumbers] as [N]
ON  
    I.FlightNumber = N.FlightNumber 
WHERE 
    FlightDate = @FlightDate AND (@Origin='' OR @Origin = N.Origin) AND (@dest = '' OR @dest = N.Destination)

FlightInfo
===========
FlightNumber    nvarchar(16)
FlightDate  datetime    
STD nvarchar(4) 
RemarkId int NULL

FlightRemarkDetail
==================
RemarkDetailId  int 
RemarkId    int NOT NULL
LangCode    nvarchar(2) 
Message nvarchar(512)   
4

1 に答える 1

1

これLEFT OUTER JOINは本質的に同じことです。 LEFT OUTER JOIN子テーブルに一致するレコードが必要ないようにします。したがって、FlightRemarkDetailにレコードがない場合は、単にnullとして表示されます(サブクエリから取得する結果と同様)。ただし、これは、FlightInfoとFlightRemarkDetailの間に1対1(または1対0)の一致があることを前提としています。FlightInfoごとに複数のFlightRemarkDetailレコードが存在する場合、行が重複します。

SELECT 
     I.FlightNumber
    ,FlightDate
    ,STD
    ,D.Message As [Remark]
FROM 
     [FlightInfo] as [I]
JOIN [FlightNumbers] as [N] ON I.FlightNumber = N.FlightNumber 
LEFT OUTER JOIN [FlightRemarkDetail] as [D] ON I.RemarkId = D.RemarkId
WHERE 
    FlightDate = @FlightDate AND (@Origin='' OR @Origin = N.Origin) AND (@dest = '' OR @dest = N.Destination)
于 2012-10-03T05:35:45.403 に答える