【问题标题】:how to get first value of inner join distinct value from other table如何从其他表中获取内部连接不同值的第一个值
【发布时间】:2018-11-15 19:29:01
【问题描述】:

我有下面的图片和查询。问题是我的查询向我显示了错误的值,在多个记录中没有显示正确的酒店名称,这意味着我想要 VoucherHotelTable 中的第一家酒店,但由于 Distinct 我想请帮我解决这个问题

Select distinct v.VoucherId,u.Name,v.ArrivalFromCity,
       CAST(v.ArrivalDate  AS DATE) as ADDate, v.ArrivalFlightNo, hm.HotelName
from  VoucherMaster v
inner join UserMaster u on  v.AgentId = u.UserId
inner join VoucharHotel vh on v.VoucherId = vh.VoucharId
inner join HotelMaster hm on vh.HotelId = hm.HotelId
inner join AirportTerminal t on  v.ArrivalTerminalId = t.AirprtTerminalId 
where v.ArrivalDate  between '11/15/2018 12:00:00 AM'
    and '11/16/2018 12:00:00 AM'  AND v.ArrivalSectorId = 3

【问题讨论】:

标签: sql-server sql-server-2012 sql-server-2014


【解决方案1】:

此查询正在通过分区进行。 试试这个。 rank() 函数应该为每张优惠券返回酒店的排名。

;with VoucherHotelRnk as (
    select voucherId, hotelId, date, rank() over(partition by voucherId order by date) rnk
    from VoucharHotel
)
Select v.VoucherId,u.Name,v.ArrivalFromCity,
       CAST(v.ArrivalDate  AS DATE) as ADDate, v.ArrivalFlightNo, hm.HotelName
from  VoucherMaster v
inner join UserMaster u on  v.AgentId = u.UserId
inner join VoucherHotelRnk vh on v.VoucherId = vh.VoucherId and vh.rnk = 1
inner join HotelMaster hm on vh.HotelId = hm.HotelId
inner join AirportTerminal t on  v.ArrivalTerminalId = t.AirprtTerminalId 
where v.ArrivalDate  between '11/15/2018 12:00:00 AM'
    and '11/16/2018 12:00:00 AM'  AND v.ArrivalSectorId = 3

【讨论】:

  • 列名 'voucherId' 无效。列名“hotelId”无效。感谢您的回答,非常感谢,但是当我执行此查询时,它会向我显示此错误
  • 我已经更新了我的查询。我忘了在 cte 中提及凭证酒店表。
  • 同样的错误:(无效的列名'voucherId'。
  • 不清楚。您的捕获显示 voucharHotel(带有 a)和一个列 voucherId(带有 e)。并且您的查询显示 voucharId(带有 a)。我认为您可以自己修复拼写错误(不确定数据库中的拼写是否正确)。
  • 好的,谢谢兄弟,我会检查
【解决方案2】:
;with VoucherHotelRnk as (
    select voucherId, hotelId, date, ROW_NUMBER() over(partition by voucherId order by date) rowcount
    from VoucharHotel
)
Select v.VoucherId,u.Name,v.ArrivalFromCity,
       CAST(v.ArrivalDate  AS DATE) as ADDate, v.ArrivalFlightNo, hm.HotelName
from  VoucherMaster v
inner join UserMaster u on  v.AgentId = u.UserId
inner join VoucherHotelRnk vh on v.VoucherId = vh.VoucherId and vh.rowcount= 1
inner join HotelMaster hm on vh.HotelId = hm.HotelId
inner join AirportTerminal t on  v.ArrivalTerminalId = t.AirprtTerminalId 
where v.ArrivalDate  between '11/15/2018 12:00:00 AM'
    and '11/16/2018 12:00:00 AM'  AND v.ArrivalSectorId = 3

【讨论】:

  • 您好,欢迎来到 Stack Overflow。为了使其成为适当的答案,您必须首先解释您的答案,以便 OP 可以理解为什么这是正确的解决方案,或者确定它是否不是正确的解决方案。你不能只发布一个代码块。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多