Mac*_*ack 4 sql-server subquery
SELECT TOP N seats.*, eventtickets.eticketprice from seats
INNER JOIN eventtickets ON eventtickets.etickettype = seats.seattype
WHERE ((Seats.seatType ='BOXSEAT')
AND seatID not in (select seatID from ticketsales WHERE eventID=6))
ORDER BY convert (int, seats.seatSection), seats.seatrow ASC
Run Code Online (Sandbox Code Playgroud)
我上面的查询生成了 N 个座位中的最佳可用数量,但它会填满一个部分,然后将该订单的其余部分放在下一个部分。我需要它来找到一个新的部分,所有 N 个座位都可用。如果座位在TicketSales桌子上,则不可用。如果salecategory为 Null,则表示票证尚未售出/阻止/保留,因此可用。
它显然限制在 6 个座位上,但我确实有一个部分,一排有 30 多个座位。
Section 1:
Row 1: 1-2-3
Row 2: 4-5-6
Section 2:
Row 1: 1-2-3
Row 2: 4-5-6
Run Code Online (Sandbox Code Playgroud)
等等。
我没办法。连续盯着这个看了两天,我的脑子里一片空白。我在 SQL 方面非常薄弱,令人惊讶的是我远远超过了这一点。我想我已经接近了,但没有辣酱玉米饼馅。
请参阅随附的 2 个主表的图片。我只需要seatpricefromeventtickets表所以它不是那么重要。
我感谢你在这方面给我的任何帮助。
如果您对已有的内容感到满意,请尝试从一组不同的部分开始,交叉连接,然后将您的子查询过滤到仅该部分。这样,就像将每个部分视为自己的事件一样。
但是......为什么不考虑查看所有座位并找到第(N-1)个下一个是实际正确数字的块:
SELECT * FROM
(SELECT seats.*, eventtickets.eticketprice,
LEAD(seats.SeatID,@N-1) OVER (PARTITION BY seats.seatSection ORDER BY seats.SeatID) AS SeatNAway
from seats
INNER JOIN eventtickets ON eventtickets.etickettype = seats.seattype
WHERE ((Seats.seatType ='BOXSEAT')
AND seatID not in (select seatID from ticketsales WHERE eventID=6))
) s
WHERE s.SeatId = s.SeatNAway - (@N-1)
ORDER BY convert (int, s.seatSection), s.seatrow ASC
Run Code Online (Sandbox Code Playgroud)
看看你如何处理这个也许......当然,检查你是否理解内部子查询。