【问题标题】:Is it possible to have multiple joins between two tables in stored procedure?存储过程中的两个表之间是否可以有多个联接?
【发布时间】:2021-08-20 11:09:20
【问题描述】:

我有两张桌子,“Booking”和“City”。 CityName 字段是 City 表中的主键,我已将其用作 Booking 表中“SourceCity”和“DestinationCity”两列的外键。我想创建一个存储过程来从 Booking 表中选择所有现有数据以创建视图列表,为此我编写了以下内容。

SELECT  [dbo].[Booking].[BookingID],
        [dbo].[Booking].[CustomerName],
        [dbo].[City].[CityName],
        [dbo].[City].[CityName],
        [dbo].[Booking].[StartingDate],
        [dbo].[Booking].[EndingDate],
        [dbo].[Car].[LicensePlateNumber],
        [dbo].[Driver].[DriverName],
        [dbo].[Booking].[AdvanceTaken],
        [dbo].[Booking].[PendingPayment],
        [dbo].[Booking].[TotalRent],
        [dbo].[Booking].[BookingDate],
        [dbo].[Booking].[IDProof]

FROM [dbo].[Booking]
**LEFT OUTER JOIN [dbo].[City]  
ON [dbo].[Booking].[SourceCity] = [dbo].[City].[CityName]
AND [dbo].[Booking].[DestinationCity] = [dbo].[City].[CityName]**
LEFT OUTER JOIN [dbo].[Driver]
ON [dbo].[Driver].[DriverID] = [dbo].[Booking].[DriverAllotted]
LEFT OUTER JOIN [dbo].[Car]
ON [dbo].[Car].[CarID] = [dbo].[Booking].[CarAllotted]
ORDER BY [dbo].[Booking].[BookingID]

我不确定是否可以执行以下操作

LEFT OUTER JOIN [dbo].[City]  
ON [dbo].[Booking].[SourceCity] = [dbo].[City].[CityName]
AND [dbo].[Booking].[DestinationCity] = [dbo].[City].[CityName]

【问题讨论】:

  • 我不确定是否可以执行以下操作 - 那么当您尝试时发生了什么?
  • 您可能需要阅读使用表aliases。它不仅可以毫无歧义地重复使用同一个表,还可以使您的 SQL 更具可读性
  • 仅供参考3+ part naming on Columns will be Deprecated,如@GarethD 所说,坚持使用别名。它不仅能让你的代码更简洁,还能让你的代码正常工作。

标签: sql sql-server sql-server-2008


【解决方案1】:

我猜你需要一个不同的 JOIN

FROM [dbo].[Booking] as booking
LEFT OUTER JOIN [dbo].[City]  as source_city
ON booking.[SourceCity] = source_city.[CityName]
LEFT OUTER JOIN [dbo].[City]  as destination_city
ON booking.[DestinationCity] = destination_city.[CityName]

....

【讨论】:

    【解决方案2】:

    是的,这是可能的,您只需要使用不同的表 alias。除了引用同一个表两次之外,表别名可以让你的代码看起来更干净,例如

    SELECT  b.CustomerName,
            sc.CityName AS SourceCity,
            dc.CityName AS DestinationCity,
            b.StartingDate,
            b.EndingDate,
            c.LicensePlateNumber,
            d.DriverName,
            b.AdvanceTaken,
            b.PendingPayment,
            b.TotalRent,
            b.BookingDate,
            b.IDProof
    FROM    dbo.Booking AS b
            LEFT OUTER JOIN dbo.City AS sc
                ON sc.CityName= b.SourceCity
            LEFT OUTER JOIN dbo.City AS dc  -- Different Alias here
                ON dc.CityName = b.DestinationCity
            LEFT OUTER JOIN dbo.Driver AS d
                ON d.DriverID = b.DriverAllotted
            LEFT OUTER JOIN dbo.Car AS c
                ON c.CarID = b.CarAllotted
    ORDER BY
            b.BookingID;
    

    我很欣赏 cleaner 有点主观,但如果有人发现这比您的原始查询更难阅读,我会感到惊讶

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2016-12-03
      • 1970-01-01
      • 2020-09-15
      • 2016-02-27
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多