sproc の作成について助けが必要です。テーブル値パラメーター @Locations を使用します。その Type は次のように定義されています。
CREATE TYPE [dbo].[tvpLocation] AS TABLE(
[CountryId] [int] NULL,
[ResortName] [nvarchar](100) NULL,
[Ordinal] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[Ordinal] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
@Locations には少なくとも 1 行が含まれます。各行には、null 以外の CountryId があり、null 以外の ResortName がある場合があります。各行には一意の序数があり、最初は 0 です。@Locations の CountryId と ResortName の組み合わせは一意になります。
sproc は、次のテーブル構造に対して検索する必要があります。
ブラウザによっては、画像を右クリックして [画像を表示] などを選択すると、画像が見やすくなります。
これが私が立ち往生している場所です.sprocはツアーを見つけることができるはずです:
- ツアーの 1 番目の TourHotel (序数 0) は、@Locations (序数 0) の 1 番目の行の同じ CountryId (および指定されている場合は ResortName) を持ちます。
- また、@Locations の行が 1 行を超える場合、ツアーには追加の TourHotels が必要であり、そのすべてがこれらの残りの @Locations 行の残りの CountryIds (および指定されている場合は ResortNames) に含まれている必要があります。
編集これは、Anthony Faull の提案に基づいて、私が最終的に使用したコードです。どうもありがとうアンソニー:
select distinct T.Id
from tblTour T
join tblTourHotel TH on TH.TourId = T.Id
join tblHotel H ON H.Id = TH.HotelId
JOIN @Locations L ON
(
(
L.Ordinal = 0
AND TH.Ordinal = 0
)
OR
(
L.Ordinal > 0
AND TH.Ordinal > 0
)
)
AND L.CountryId = H.CountryId
AND
(
L.ResortName = H.ResortName
OR L.ResortName IS NULL
)
cross apply( select COUNT(TH2.Id) AS [Count] FROM tblTourHotel TH2 where TH2.TourId = TH.TourId ) TourHotelCount
where
TourHotelCount.[Count] = @LocationCount
group by T.Id, T.TourRef, T.Description, T.DepartureDate, T.NumNights, T.DepartureAirportId, T.DestinationAirportId, T.AirlineId, T.FEPrice
having COUNT(distinct TH.Id) = @LocationCount