2017-03-28 3 views
1

J'utilise le code suivant pour récupérer le rapport.SQL Server: Problème dans la requête existe remplacer par jointures

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 

J'ai un million d'enregistrements dans la base de données. Pour les petits enregistrements (2,3) jours, cela fonctionne correctement. Mais pour les enregistrements volumineux (10 jours), j'obtiens l'erreur de verrouillage/d'expiration de la ressource.

J'ai trouvé un problème est avec le code suivant:

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) 
    ) 

Si je supprime cette code.I ne suis pas face à beaucoup question. S'il vous plaît aidez-moi à trouver une autre façon d'écrire ce code ou Optimiser l'utilisation de ce

+1

Je ne pense pas qu'il pourrait résoudre votre problème, mais je pense que vous pouvez réécrire votre condition 'EXISTE ( \t \t \t SELECT A.ID \t \t \t DE @AirportList A \t \t \t OÙ EN A.ID (Airport1.ID, Airport2.ID) \t \t \t) ' \t \t \t et essayez à nouveau. Pouvez-vous poster expliquer plan? – etsa

+1

Avez-vous essayé de créer INNER JOIN dans la table @AirportList où A.ID sera égal à [Airport1] .ID ou [Airport2] .ID ?? –

+0

@etsa: Ne pas faire de différence –

Répondre

0

Ajouter une clé primaire à la table temporaire

DECLARE @AirportList TABLE (ID bigint primary key) 
0

Essayez ceci:

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] 
    INNER JOIN @AirportList AS A ON A.ID = [AirOrigin].[DepartureAirportID] OR A.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 
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] 
    INNER JOIN @AirportList AS A ON A.ID = [AirOrigin].[DepartureAirportID] OR A.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 
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 
+0

Il est allé dans la boucle infinie. –

+0

Vérifiez la nouvelle mise à jour s'il vous plaît. –