我有兩張桌子:Reservations 和 ReservationNights(每個預訂都有很多晚)。

在存盤程序中,我有一個如下所示的變數:@roomTypeList = '2;3;4;5;'-> 它是 RoomUseIds 的串列。
我只需要顯示具有這些 Id 之一的預訂晚數的預訂(在本例中,它應該只顯示預訂 14105,因為存在 RoomUseId = 3 且'2;3;4;5;'變數包含 3 的現有晚數。
我試過使用這樣的東西,但它沒有產生好的結果 - 有時它只顯示 1 個保留,而應該顯示多個,通常它什么都不顯示。
SELECT DISTINCT r.Id, r.BookingStatus, r.CurrencyId
FROM Reservations r
--JOIN ReservationNights rn ON rn.ReservationId = r.Id
WHERE
(@roomTypeListLocal IS NULL OR (@roomTypeListLocal LIKE ('%' CAST((SELECT STUFF((SELECT ';' CAST(rn.RoomUseId as nvarchar(MAX))
FROM ReservationNights rn
WHERE rn.ReservationId = r.Id AND rn.RoomUseId IS NOT NULL
FOR XML PATH('')), 1, 1, '')) as nvarchar(MAX)) ';%')))
uj5u.com熱心網友回復:
你的關鍵問題是缺乏規范化。如果您有串列,請將其存盤為串列。
所以你需要一個表變數或表值引數。在緊要關頭,您可以拆分現有的字串,但最好首先將資料采用正確的格式。
DECLARE @roomTypeList TABLE (roomType int PRIMARY KEY);
INSERT @roomTypeList (roomType)
SELECT *
FROM STRING_SPLIT(@roomTypeListLocal, ';');
SELECT
r.Id,
r.BookingStatus,
r.CurrencyId
FROM Reservations r
WHERE
@roomTypeListLocal IS NULL
OR EXISTS (SELECT 1
FROM ReservationNights rn
JOIN @roomTypeList rl ON rl.roomType = rn.RoomUseId
WHERE rn.ReservationId = r.Id
);
如果你真的想堅持使用逗號分隔的串列,你可以合并STRING_SPLIT到上面的查詢中,而不是嘗試構造一個等效的聚合字串。
uj5u.com熱心網友回復:
我建議另一種方法:確保您的變數在每個值之前和之后都有一個分隔符(例如:)';2;3;4;5;',并使用EXISTS查詢:
SELECT DISTINCT r.Id, r.BookingStatus, r.CurrencyId
FROM Reservations r
WHERE
(
@roomTypeListLocal IS NULL
OR
EXISTS
(
SELECT 1
FROM ReservationNights rn
WHERE rn.ReservationId = r.Id
AND rn.RoomUseId IS NOT NULL
AND @roomTypeListLocal LIKE ';' CAST(rn.RoomUseId As varchar(10)) ';'
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366951.html
標籤:sql sql-server 数据库 查询语句 存储过程
下一篇:用前導“-”替換尾隨的“-”
