我正在使用以下代碼來獲取報告。SQL Server:問題存在查詢替換連接
DECLARE @CountryID smallint = 100
DECLARE @UTCTDIM smallint = 330
DECLARE @MarketProfileID smallint = 2
DECLARE @StartDate datetime = '2017-01-01'
DECLARE @EndDate datetime = '2017-01-03'
DECLARE @CustomerTypeID smallint = 1
SET NOCOUNT ON
DECLARE @AirportList TABLE (ID bigint)
INSERT INTO @AirportList (ID)
SELECT
DISTINCT Airport.ID
FROM
Airport
INNER JOIN CityList ON Airport.CityID = CityList.ID
INNER JOIN CountryList ON CityList.CountryID = CountryList.ID
where
CountryList.NameEN in ('San Marino','Serbia','Slovakia','Slovenia','Spain','Sweden','Switzerland','Turkey','Ukraine','United Kingdom','Vatican CityList')
DECLARE @TempSales TABLE
(
[Type] varchar(50),
[From] char(3),
[To] char(3),
[Tickets] bigint,
[Average fare] decimal(18,3),
[Net sale] decimal(18,3)
)
INSERT INTO @TempSales
SELECT
[AirTrips].[NameEN] AS [Type],
[Airport1].[IATACode] AS [From],
[Airport2].[IATACode] AS [To],
NULL,
AVG(ISNULL([AirTraveler].[FareBaseAmount], 0)) + AVG(ISNULL([AirTraveler].[Taxes], 0)) AS [Average fare],
SUM(ISNULL([AirTraveler].[AmountNetRemit], 0)) AS [Net sale]
FROM
[BookingDetails] WITH (READPAST)
INNER JOIN [Bookings] WITH (READPAST) ON Booking.BookingFileID = BookingFile.ID
INNER JOIN [AirTrips] WITH (READPAST) ON Booking.AirTripTypeID = AirTrips.ID
INNER JOIN [AirTraveler] WITH (READPAST) ON AirTraveler.BookingID = Booking.ID
INNER JOIN [AirOrigin] WITH (READPAST) ON AirOrigin.BookingID = Booking.ID
INNER JOIN [Airport] AS [Airport1] WITH (READPAST) ON [Airport1].[ID] = [AirOrigin].[DepartureAirportID]
INNER JOIN [Airport] AS [Airport2] WITH (READPAST) ON [Airport2].[ID] = [AirOrigin].[ArrivalAirportID]
WHERE
[Bookings].[BookingStatusID] IN (16, 20, 22, 23)
AND [Bookings].[IsActive] = 1
AND [AirOrigin].[AirTripDirectionTypeID] = 1
AND (ISNULL([AirTraveler].[BaseAmountNetRemit], 0) + ISNULL([AirTraveler].[TaxesNetRemit], 0)) <> 0
AND [Bookings].[RemitDate] BETWEEN @StartDate AND @EndDate
AND [BookingDetails].[MarketProfileID] = @MarketProfileID
AND [BookingDetails].[BookedForOrganizationID] IS NULL
AND (
EXISTS (SELECT A.ID FROM @AirportList A WHERE A.ID = [Airport1].ID)
OR
EXISTS (SELECT A.ID FROM @AirportList A WHERE A.ID = [Airport2].ID)
)
GROUP BY
[AirTrips].[NameEN],
[Airport1].[IATACode],
[Airport2].[IATACode]
INSERT INTO @TempSales
SELECT
[AirTrips].[NameEN] AS [Type],
[Airport1].[IATACode] AS [From],
[Airport2].[IATACode] AS [To],
COUNT(*) [Tickets],
NULL,
NULL
FROM
[BookingDetails] WITH (READPAST)
INNER JOIN [Bookings] WITH (READPAST) ON Booking.BookingFileID = BookingFile.ID
INNER JOIN [AirTrips] WITH (READPAST) ON Booking.AirTripTypeID = AirTrips.ID
INNER JOIN [AirTraveler] WITH (READPAST) ON AirTraveler.BookingID = Booking.ID
INNER JOIN [AirOrigin] WITH (READPAST) ON AirOrigin.BookingID = Booking.ID
INNER JOIN [Airport] AS [Airport1] WITH (READPAST) ON [Airport1].[ID] = [AirOrigin].[DepartureAirportID]
INNER JOIN [Airport] AS [Airport2] WITH (READPAST) ON [Airport2].[ID] = [AirOrigin].[ArrivalAirportID]
WHERE
[Bookings].[BookingStatusID] IN (16, 22, 23)
AND [Bookings].[IsActive] = 1
AND [AirOrigin].[AirTripDirectionTypeID] = 1
AND (ISNULL([AirTraveler].[BaseAmountNetRemit], 0) + ISNULL([AirTraveler].[TaxesNetRemit], 0)) <> 0
AND [Bookings].[RemitDate] BETWEEN @StartDate AND @EndDate
AND [BookingDetails].[MarketProfileID] = @MarketProfileID
AND [BookingDetails].[BookedForOrganizationID] IS NULL
AND (
EXISTS (SELECT A.ID FROM @AirportList A WHERE A.ID = [Airport1].ID)
OR
EXISTS (SELECT A.ID FROM @AirportList A WHERE A.ID = [Airport2].ID)
)
GROUP BY
[AirTrips].[NameEN],
[Airport1].[IATACode],
[Airport2].[IATACode]
SELECT
[Type],
[From],
[To],
COALESCE(SUM([Tickets]), 0) AS [Tickets],
COALESCE(SUM([Average fare]), 0) AS [Average fare],
COALESCE(SUM([Net sale]), 0) AS [Net sale]
FROM
@TempSales
GROUP BY
[Type],
[From],
[To]
ORDER BY
[Tickets] DESC,
[Type] ASC,
[From] ASC,
[To] ASC
我在數據庫中有百萬條記錄。 對於小記錄(2,3)天,它工作正常。 但對於大型記錄(10天),我正在獲取資源鎖定/超時錯誤。
我發現一個問題是與下面的代碼:
AND (
EXISTS (SELECT A.ID FROM @AirportList A WHERE A.ID = [Airport1].ID)
OR
EXISTS (SELECT A.ID FROM @AirportList A WHERE A.ID = [Airport2].ID)
)
如果我刪除此code.I我沒有面臨太大的問題。 請幫我找到寫這個代碼或租期,提高它
我不認爲它可以做解決你的問題,但我認爲你可以重寫你的病情爲'EXISTS( \t \t \t SELECT A.ID \t \t \t從@AirportList一個 \t \t \t WHERE A.ID IN(Airport1.ID,Airport2.ID) \t \t \t)' \t \t \t ,然後再試一次。 你可以發佈解釋計劃嗎? – etsa
您是否曾嘗試將@AirportList表添加到@AirportList表中,其中A.ID將等於[Airport1] .ID或[Airport2] .ID? –
@etsa:沒有什麼區別 –