【问题标题】:View and Combine 2 rows in 1 from same table从同一个表中查看并合并 1 中的 2 行
【发布时间】:2015-04-24 09:05:21
【问题描述】:

我无法根据需要查看数据,

IDFlight | Dep1 | Des1| Date  | IDFlight2 | Dep2 | Des2 | Date   | Price
---------+------+-----+-------+-----------+------+------+--------+--------
    2    |  AYT | PRN |20.3.15|     3     | PRN  | AYT  | 27.3.15|  150
    2    |  AYT | PRN |20.3.15|     4     | PRN  | AYT  | 30.3.15|  150
    1    |  AYT | PRN |23.3.15|     4     | PRN  | AYT  | 30.3.15|  150 
    1    |  AYT | PRN |17.3.15|     3     | PRN  | AYT  | 27.3.15|  150

所以搜索查询是日期 +- 3 天,两个航班。

在我的情况下,每个航班都单独在表 Flight 中注册,每个航班都有他的航班号和他的方向、日期和定价(例如返回和单程)。 现在这里的问题是,当用户选择返回选项时,会在一行中显示 2 个航班,(航班 1 到目的地,航班 2 从目的地返回)图片中的示例中的日期线之间也存在差异.

我想要实现的是像上面的例子一样显示数据,每个“单向”记录都应该与“返回”记录匹配。即使第一个数据是重复的。

我做了很多研究但没有结果, 我也尝试过使用视图但没有成功

我尝试联合没有成功。

@prmDepDay int, @prmDesDay int, @prmDateDep datetime, @prmFrom int, @prmTo int, 
@prmDateRe datetime, @prmFromRe int, @prmToRe int, @prmTotalRe int 
AS
BEGIN
DROP TABLE departureflights

SELECT TOP(100) PERCENT 
             t_flights.idflight, 
             t_flights.flightnumber, 
             t_departureairport.depairportname, 
             t_destinationairport.desairportname, 
             t_flights.startdate, 
             t_flights.totalseats 
  INTO       departureflights 
  FROM       t_flights 
  INNER JOIN t_departureairport 
  ON         t_flights.iddepartureairport = t_departureairport.iddepartureairport 
  INNER JOIN t_destinationairport 
  ON         t_flights.iddestinationairport = t_destinationairport.iddestinationairport 
  INNER JOIN t_flightdirections 
  ON         t_flights.iddirection = t_flightdirections.iddirection 
  WHERE      t_departureairport.iddepartureairport = @prmFrom 
  AND        t_destinationairport.iddestinationairport = @prmTo 
  AND        startdate >= Dateadd(day,-@prmDepDay,@prmDateDep) 
  AND        startdate <= Dateadd(day,@prmDepDay,@prmDateDep) 
             --and TotalSeats>= @prmTotal 
  ORDER BY   t_flights.startdate

  DROP TABLE returnflights        

  SELECT     t_flights.idflight, 
             t_flights.flightnumber              AS ReFlightNumber, 
             t_departureairport.depairportname   AS ReDepAirportName, 
             t_destinationairport.desairportname AS ReDesAirportName, 
             t_flights.enddate , 
             t_flights.totalseats 
  INTO       returnflights 
  FROM       t_flights 
  INNER JOIN t_departureairport 
  ON         t_flights.iddepartureairport = t_departureairport.iddepartureairport 
  INNER JOIN t_destinationairport 
  ON         t_flights.iddestinationairport = t_destinationairport.iddestinationairport 
  INNER JOIN t_flightdirections 
  ON         t_flights.iddirection = t_flightdirections.iddirection 
  WHERE      t_departureairport.iddepartureairport = @prmFromRe 
  AND        t_destinationairport.iddestinationairport = @prmToRe 
  AND        enddate >= Dateadd(day,-@prmDesDay,@prmDateRe) 
  AND        enddate <= Dateadd(day,@prmDesDay,@prmDateRe) 
  AND        totalseats>= @prmTotalRe 
  ORDER BY   t_flights.enddate

【问题讨论】:

  • 也许交叉连接对你有帮助?
  • 您已将此帖子列为 C#。您可以从 C# 执行存储 SQL 过程,然后返回结果。这在 C# 中比使用 SQL 查询更容易完成。执行连接后,您可以从单个“连接结果”创建多行。如果您可以发布存储 SQL 过程的结果,我可以提供帮助。

标签: c# sql sql-server-2008


【解决方案1】:

如果您将 t_flights 表与自身连接起来,您应该在一行中同时获得出发和返回的航班信息。

SELECT journey_out.idflight IDFlight, 
    journey_out.iddepartureairport Dep1, 
    journey_out.iddestinationairport Des1, 
    journey_out.enddate Date1,
    journey_return.idflight IDFlight2, 
    journey_return.iddepartureairport Dep2, 
    journey_return.iddestinationairport Dep2, 
    journey_return.enddate Date2
FROM t_flights journey_out
INNER JOIN t_flights journey_return 
    ON journey_out.iddestinationairport = journey_return.iddepartureairport 
    AND journey_out.enddate < journey_return.startdate
ORDER BY journey_out.startdate

第一个加入条件确保航班从正确的机场回家,第二个条件确保返程不会在到达之前开始。

如果您想在与返回选项相同的结果集中查看单向选项,您可以将其更改为 LEFT JOIN 而不是 INNER JOIN。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多