You are on page 1of 8

https://staging-booking.tourpaq.com/BookingEngine/EditBooking/Booking.aspx?

bid=567569

http://localhost:4915/BookingEngine/EditBooking/Booking.aspx?bid=567591 - has
discount

https://staging-booking.tourpaq.com/BookingEngine/EditBooking/Booking.aspx?
bid=567774 - many transports && hotels

DiscountID = 8079

139 hotelArrivalID, hotelResortID 655, transportIDs = 8061, hotelRoomID: 16777,


hotelID: 2919

rwbtpq
^@7yix*4Wvp4

2919, 139, 655, 8061, 16777

select top 1000 ds.Code, dsr.Code, dsr.Type, ds.DiscountSuppID, * from


Discount_Supplier as ds
INNER JOIN AgencyDiscountSupplier on AgencyDiscountSupplier.DiscountSuppID =
ds.DiscountSuppID and AgencyDiscountSupplier.AgencyID = 58
LEFT JOIN Discount_Supplier_Resurser as dsr on ds.DiscountSuppID =
dsr.DiscountSuppID and AgencyDiscountSupplier.InternetSale = 1

where ds.DiscountSuppID = 8083

--COMPARING THE RESULTS AND MAKING SURE EVERYTING IS OK

SELECT top 1000


Discount_Supplier.Code,
dsrResourceHotelIDs.DiscountSuppID as t,
dsrResourceHotelIDs.Code as ResourcesHotelID,
dsrTransportIDs.Code as ResourcesTransportID,
Discount_Supplier.PlainText as [Name],
Discount_Supplier.FamilyDiscount,
Discount_Supplier.DiscountSuppID,
Discount_Supplier.Price,
Discount_Supplier.DiscountOrSupplier as DiscountOrSupplement,
Discount_Supplier.DiscSupplCategoryID as CategoryID,
Discount_Supplier.GenericService,
Discount_Supplier.LinkedToProduct as IsLinkedToProduct,
Discount_Supplier.Age,
Discount_Supplier.DoNotCombineWithOtherDiscounts,
Discount_Supplier.AvailableFirstPassenger,
Discount_Supplier.PassengersNoToApplyTo,
dsrHotelRoomIDs.SubTypeCode as HotelRoomID,
dsrHotelIDs.Code as HotelID,
AvailableFirstPassengerInRoom =
Discount_Supplier.AvailableFirstPassengerInRoom,
Discount_Supplier.BkgDateStart as BookingStartDate,
Discount_Supplier.BkgDateStop as BookingEndDate,
Discount_Supplier.DateStart as DepartureStartDate,
Discount_Supplier.DateStop as DepartureEndDate,
DiscSupplCategory.BehaviorOnWeb
FROM Discount_Supplier
INNER JOIN DiscSupplCategory on Discount_Supplier.DiscSupplCategoryID =
DiscSupplCategory.DiscSupplCategoryID
INNER JOIN AgencyDiscountSupplier on
AgencyDiscountSupplier.DiscountSuppID = Discount_Supplier.DiscountSuppID and
AgencyDiscountSupplier.AgencyID = 58
LEFT JOIN Discount_Supplier_Resurser as dsrHotelRoomIDs on
dsrHotelRoomIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrHotelRoomIDs.Type = 5
LEFT JOIN Discount_Supplier_Resurser as dsrHotelIDs on
dsrHotelIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
( dsrHotelIDs.Type = 2 or dsrHotelIDs.Type = 5 )
LEFT JOIN Discount_Supplier_Resurser as dsrResourceHotelIDs on
dsrResourceHotelIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrResourceHotelIDs.Type = 2
LEFT JOIN Discount_Supplier_Resurser as dsrTransportIDs on
dsrTransportIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrTransportIDs.Type = 3
LEFT JOIN Discount_Supplier_Resurser as dsrRealTransport on
dsrRealTransport.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrRealTransport.Type = 4
LEFT JOIN Discount_Supplier_Resurser as dsrHotelResort on
dsrHotelResort.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrHotelResort.Type = 1
LEFT JOIN Discount_Supplier_Resurser as dsrHotelArrival on
dsrHotelArrival.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrHotelArrival.Type = 0
WHERE
Discount_Supplier.CompanyID = 26
--and (
-- not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 2)
-- or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 2 and Discount_Supplier_Resurser.Code in ( 2919 )
and Discount_Supplier_Resurser.SubTypeCode is null)
--)
--and (
-- not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 3)
-- or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 3 and Discount_Supplier_Resurser.Code in ( 8061))
--)
and (dsrResourceHotelIDs.DiscountSuppID IS NULL
OR (
dsrResourceHotelIDs.DiscountSuppID IS NOT NULL
AND dsrResourceHotelIDs.Code in ( 2919 ) and
dsrResourceHotelIDs.SubTypeCode IS NULL
))
and (dsrTransportIDs.DiscountSuppID IS NULL
OR (
dsrTransportIDs.DiscountSuppID IS NOT NULL
AND dsrTransportIDs.Code in (8061 ) and
dsrTransportIDs.SubTypeCode IS NULL
))
=====================
USE [Tourpaq_Staging]
GO
/****** Object: StoredProcedure [dbo].[GetAutomaticDiscount] Script Date:
2/2/2023 11:31:14 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Gabriel Marinescu
-- Create date: 2019.05.28
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GetAutomaticDiscount]
@companyID int,
@agencyID int,
@forSale bit,
@internetSale bit,
@bookingDate datetime,
@departureDate datetime,
@hotelRoomID int,
@transportID int,
@realTransportId int,
@period int,
@nights int,
@hotelArrivalIDs nvarchar(max),
@hotelResortID nvarchar(max),
@transportIDs nvarchar(max),
@realTransportIDs nvarchar(max),
@hotelIDs nvarchar(max),
@hotelRoomIDs nvarchar(max),
@priceTypes nvarchar(max),
@genderTypes nvarchar(max),
@discountIDs nvarchar(max),
@allowOneWay bit,
@ages nvarchar(max)
AS
BEGIN
SET NOCOUNT ON;

declare @ageQuery nvarchar(MAX) = '( ' + replace(@ages, ',', N' between


Discount_Supplier_Price.StartAge AND Discount_Supplier_Price.EndAge) OR (') + N'
between Discount_Supplier_Price.StartAge AND Discount_Supplier_Price.EndAge )'

if @realTransportIDs is null or len(@realTransportIDs) = 0


begin
set @realTransportIDs = '0'
end

declare @sql nvarchar(max) = N'


SELECT
Discount_Supplier.Code,
Discount_Supplier.PlainText as [Name],
Discount_Supplier.FamilyDiscount,
Discount_Supplier.DiscountSuppID,
Discount_Supplier.Price,
Discount_Supplier.DiscountOrSupplier as DiscountOrSupplement,
Discount_Supplier.DiscSupplCategoryID as CategoryID,
Discount_Supplier.GenericService,
Discount_Supplier.LinkedToProduct as IsLinkedToProduct,
Discount_Supplier.Age,
Discount_Supplier.DoNotCombineWithOtherDiscounts,
Discount_Supplier.AvailableFirstPassenger,
Discount_Supplier.PassengersNoToApplyTo,
dsrHotelRoomIDs.SubTypeCode as HotelRoomID,
dsrHotelIDs.Code as HotelID,
dsrResourceHotelIDs.Code as ResourcesHotelID,
dsrTransportIDs.Code as ResourcesTransportID,
AvailableFirstPassengerInRoom =
Discount_Supplier.AvailableFirstPassengerInRoom,
Discount_Supplier.BkgDateStart as BookingStartDate,
Discount_Supplier.BkgDateStop as BookingEndDate,
Discount_Supplier.DateStart as DepartureStartDate,
Discount_Supplier.DateStop as DepartureEndDate,
DiscSupplCategory.BehaviorOnWeb
FROM Discount_Supplier
INNER JOIN DiscSupplCategory on Discount_Supplier.DiscSupplCategoryID =
DiscSupplCategory.DiscSupplCategoryID
INNER JOIN AgencyDiscountSupplier on
AgencyDiscountSupplier.DiscountSuppID = Discount_Supplier.DiscountSuppID and
AgencyDiscountSupplier.AgencyID = ' + cast( @agencyID as nvarchar(MAX)) + N'
LEFT JOIN Discount_Supplier_Resurser as dsrHotelRoomIDs on
dsrHotelRoomIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrHotelRoomIDs.Type = 5
LEFT JOIN Discount_Supplier_Resurser as dsrHotelIDs on
dsrHotelIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
( dsrHotelIDs.Type = 2 or dsrHotelIDs.Type = 5 )
LEFT JOIN Discount_Supplier_Resurser as dsrResourceHotelIDs on
dsrResourceHotelIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrResourceHotelIDs.Type = 2
LEFT JOIN Discount_Supplier_Resurser as dsrTransportIDs on
dsrTransportIDs.DiscountSuppID = Discount_Supplier.DiscountSuppID and
dsrTransportIDs.Type = 3
WHERE
Discount_Supplier.CompanyID = ' + cast( @companyID as nvarchar(MAX)) +
N'
and Discount_Supplier.GeneralOrSpecificate = 1
and Discount_Supplier.FixedOrManual = 0
'

if @discountIDs is not null and len(@discountIDs) > 0


begin
set @sql += N' AND Discount_Supplier.DiscountSuppID in ( ' +
@discountIDs + N' ) '
end

if @internetSale = 1
begin
set @sql += N' AND AgencyDiscountSupplier.InternetSale = 1 '
end
if @forSale = 1
begin
set @sql += N' AND AgencyDiscountSupplier.ForSale = 1 '
end
set @sql += N'
and (Discount_Supplier.BkgDateStop is null or ''' +
convert(nvarchar(max), @bookingDate, 20) + N''' <= Discount_Supplier.BkgDateStop)
and (Discount_Supplier.BkgDateStart is null or ''' +
convert(nvarchar(max), @bookingDate, 20) + N''' >= Discount_Supplier.BkgDateStart)
and (Discount_Supplier.DateStop is null or ''' + convert(nvarchar(max),
@departureDate, 20) + N''' <= Discount_Supplier.DateStop)
and (Discount_Supplier.DateStart is null or ''' +
convert(nvarchar(max), @departureDate, 20) + N''' >= Discount_Supplier.DateStart)
and (Discount_Supplier.RoomType is null or ' + cast(@hotelRoomID as
nvarchar(MAX)) + N' = Discount_Supplier.RoomType)
and (Discount_Supplier.Transport is null or Discount_Supplier.Transport
= ' + cast(@transportID as nvarchar(MAX)) + N')
and (Discount_Supplier.PeriodOrTripLenght is null or
Discount_Supplier.PeriodOrTripLenght = 0 or Discount_Supplier.PeriodOrTripLenght =
' + cast(@period as nvarchar(MAX)) + N')
and (Discount_Supplier.MinimumLength is null or
Discount_Supplier.MinimumLength <= ' + cast(@nights as nvarchar(MAX)) + N')
and (Discount_Supplier.MaximumLength is null or
Discount_Supplier.MaximumLength >= ' + cast(@nights as nvarchar(MAX)) + N')
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0 and Discount_Supplier_Resurser.Code in ( ' +
@hotelArrivalIDs + N' ))
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 1)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 1 and Discount_Supplier_Resurser.Code in ( ' +
@hotelResortID + N' ))
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 3)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 3 and Discount_Supplier_Resurser.Code in ( ' +
@transportIDs + N' ))
)
and (
' + cast(isnull(@realTransportId, 0) as nvarchar(max)) + N' = 0
or not exists(select top 1 1 from Discount_Supplier_Resurser
where Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID
and Discount_Supplier_Resurser.Type = 4)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 4 and Discount_Supplier_Resurser.Code in ( ' +
@realTransportIDs + N' ))
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 2)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 2 and Discount_Supplier_Resurser.Code in ( ' +
@hotelIDs + N' ) and Discount_Supplier_Resurser.SubTypeCode is null)
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 5)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 5 and Discount_Supplier_Resurser.Code in ( ' +
@hotelIDs + N' ) and Discount_Supplier_Resurser.SubTypeCode is null)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 5 and Discount_Supplier_Resurser.Code in ( ' +
@hotelIDs + N' ) and Discount_Supplier_Resurser.SubTypeCode in ( ' + @hotelRoomIDs
+ N' ))
)
and (
Discount_Supplier.PriceType is null
or Discount_Supplier.PriceType in ( ' + @priceTypes + N' )
)
and (
Discount_Supplier.Age is null or
Discount_Supplier.Age in ( ' + @genderTypes + N' )
)

'
if @allowOneWay = 0
begin
set @sql += N' AND (discount_supplier.allowononeway is null or
discount_supplier.allowononeway = 0) '
end

if @allowOneWay = 1
begin
set @sql += N' AND Discount_Supplier.AllowOnOneWay = 1 '
end
-- (x between Discount_Supplier_Price.StartAge AND
Discount_Supplier_Price.EndAge) OR (

set @sql += N' and (


Discount_Supplier.LinkedToProduct = 1
OR not exists(select top 1 1 from Discount_Supplier_Price where
Discount_Supplier_Price.DiscountSuppID = Discount_Supplier.DiscountSuppID)
OR exists(select top 1 1
from Discount_Supplier_Price
where
Discount_Supplier_Price.DiscountSuppID =
Discount_Supplier.DiscountSuppID
and ''' + convert(nvarchar(max), @departureDate, 20) + N'''
>= Discount_Supplier_Price.PeriodStart
and ''' + convert(nvarchar(max), @departureDate, 20) + N'''
<= Discount_Supplier_Price.PeriodStop
and ''' + convert(nvarchar(max), @bookingDate, 20) + N'''
>= Discount_Supplier_Price.BookingStartDate
and ''' + convert(nvarchar(max), @bookingDate, 20) + N'''
<= Discount_Supplier_Price.BookingStopDate
and (' + @ageQuery + N' )
)
)
'

execute sp_executesql @sql

select @sql
END

====EVENTUAL SOLUTIONS=====

SP este apelata pentru fiecare pasager; pentru records mai mici, este bine cu SP,
dar pentru records mari, poate ar fi mai bine in chunks-> trimitere params

strict pe SP optimizare:
- renuntam la SET NOCOUNT ON;
- reducem subquery urile;
- le vom folosi in left join:
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0 and Discount_Supplier_Resurser.Code in ( ' +
@hotelArrivalIDs + N' ))
using a left join can be more efficient and easier to understand
than using a combination of NOT EXISTS and EXISTS statements, especially when
working with large datasets.

CONCLUSION:

The NOT EXISTS statement returns rows from the first table (Discount_Supplier)
where there are no matching rows in the second table (Discount_Supplier_Resurser)
with a given condition (Discount_Supplier_Resurser.DiscountSuppID =
Discount_Supplier.DiscountSuppID and Discount_Supplier_Resurser.Type = 2).

The EXISTS statement returns rows from the first table (Discount_Supplier) where
there are matching rows in the second table (Discount_Supplier_Resurser) with a
given condition (Discount_Supplier_Resurser.DiscountSuppID =
Discount_Supplier.DiscountSuppID and Discount_Supplier_Resurser.Type = 2 and
Discount_Supplier_Resurser.Code in ( 2919 ) and
Discount_Supplier_Resurser.SubTypeCode is null).

The LEFT JOIN clause returns all the rows from the first table (Discount_Supplier)
and matching rows from the second table (Discount_Supplier_Resurser) based on the
join condition (dsrResourceHotelIDs.DiscountSuppID =
Discount_Supplier.DiscountSuppID and dsrResourceHotelIDs.Type = 2). The WHERE
clause then filters the results based on the condition
(dsrResourceHotelIDs.DiscountSuppID IS NULL or (dsrResourceHotelIDs.DiscountSuppID
IS NOT NULL and dsrResourceHotelIDs.Code in ( ' + @hotelIDs + N' ) and
dsrResourceHotelIDs.SubTypeCode IS NULL)).

HUGE COUNT DIFFERENCE: Yes, this is because using NOT EXISTS and EXISTS causes a
correlated subquery to be executed for each row of the main query, resulting in a
large number of executions. On the other hand, using a LEFT JOIN will give you the
desired result by performing a single join operation, which is generally faster for
large datasets.

You might also like