SQL Server连接查询未检索到正确的结果

时间:2013-12-09 19:42:51

标签: sql-server

  1. 选择其车辆从未分配给任何客户的所有经销商的列表,即PS3_VehicleBooking中没有该车辆,且承诺日期大于今天的日期。
  2. 要使用的3个表是 -

    CREATE TABLE PS3_Dealer(
        ID int IDENTITY(1,1) NOT NULL Primary KEY,
        DealerID varchar(255) NULL,
        DealerName varchar(255) NOT NULL,
        ContactNo varchar(255) NOT NULL,
        NoOfVehicles bigint NOT NULL,
        CommittedDate date NOT NULL
    );
    
    create table PS3_Vehicle 
      (
        ID int IDENTITY(1,1) NOT NULL Primary Key,
        DealerID varchar(255) NOT NULL,
        VehicleID varchar(255) UNIQUE NOT NULL,
        VehicleName varchar(255) NOT NULL,
        Capacity BIGINT NOT NULL
    
      );
    
      create table PS3_VehicleBooking
      (
      ID int IDENTITY(1,1) NOT NULL Primary Key,
      BookingID varchar(255) NOT NULL UNIQUE,
      VehicleID varchar(255) NOT NULL,
      StartDate date NOT NULL,
      EndDate date NOT NULL
      );
    

    PS3_Dealer值 -

    DealerID DealerName ContactNo NoOfVehicles CommittedDate
    1        ng         9         5             2013-12-12
    2        nikki      5         7             2013-12-25
    3        nik        4         6             2013-10-11
    4        hj         2         2             2014-11-10
    5        pk         67        8             2013-10-10
    

    PS3_Vehicle

    DealerID VehicleID VehicleName Capacity
    1        V1        ind         4
    2        V2        innova      5
    3        V3        innova      6
    1        V4        ula         8
    4        V5        hkk         2
    5        V6        ghi         9
    2        V7        bjhgi       4
    

    PS3_VehicleBooking -

    BookingID VehicleID StartDate     EndDate
      1         V1      2013-12-13     2013-12-17 
      2         V2      2013-10-11     2013-10-13
      3         V3      2014-12-10     2014-12-13
      4         V4      2012-10-10     2012-10-13
      5         V2      2013-12-14     2013-12-18
    

    预期结果 -

    DealerID  DealerName ContactNo NoOfVehicles CommittedDate
    
    4          hj        2          2           2014-11-10
    

    但我得到了 -

    DealerID  DealerName ContactNo NoOfVehicles CommittedDate
    
    4          hj        2          2           2014-11-10
    2          Nikki     5          7           2013-12-25
    

    我不想要经销商ID 2,因为经销商ID 2提供的V2出现在PS3中。

    我的查询是 -

    SELECT h.DealerID,
           h.DealerName,
           h.ContactNo,
           h.NoOfVehicles,
           h.CommittedDate
    FROM   PS3_Dealer h
           INNER JOIN(SELECT DealerID,
                             PS3_VehicleBooking.VehicleID
                      FROM   PS3_Vehicle
                             LEFT JOIN PS3_VehicleBooking
                               ON PS3_Vehicle.VehicleID = PS3_VehicleBooking.VehicleID) w
             ON h.DealerID = w.DealerID
    WHERE  w.VehicleID IS NULL
           AND h.CommittedDate > GETDATE() 
    

    请纠正我错在哪里?

2 个答案:

答案 0 :(得分:0)

编辑实际回答问题

你得到的是Nikki,因为她的车(V7)确实不在预订表中。 这应该排除Nikki。

SELECT h.DealerID,
   h.DealerName,
   h.ContactNo,
   h.NoOfVehicles,
   h.CommittedDate
FROM PS3_Dealer d
WHERE NOT EXISTS 
 (SELECT *
  FROM PS3_VehicleBookingb
  JOIN PS3_Vehiclev ON b.vehicleID = v.VehicleID
  JOIN PS3_Dealerd2 ON d2.dealerID = v.dealerID
  WHERE d2.dealerID = d.dealerID)
AND CommittedDate > Current_date()

http://sqlfiddle.com/#!2/fb365/19

答案 1 :(得分:0)

问题在于DealerID 2有2辆车。一个有预订,另一个没有。当你运行

SELECT DealerID,
        PS3_VehicleBooking.VehicleID
FROM   PS3_Vehicle
        LEFT JOIN PS3_VehicleBooking
        ON PS3_Vehicle.VehicleID = PS3_VehicleBooking.VehicleID

您将获得一条DealerID 2的记录,其中包含NULL VehicleID,另一条记录为无NULL车辆ID。

您可以尝试运行下面的语句以获得所需的结果(可能不是最佳的,但它是对您的陈述的修复):

SELECT h.DealerID,
       h.DealerName,
       h.ContactNo,
       h.NoOfVehicles,
       h.CommittedDate
FROM   PS3_Dealer h
       INNER JOIN(SELECT DealerID,
                         MAX(PS3_VehicleBooking.VehicleID) as VehicleID
                  FROM   PS3_Vehicle
                         LEFT JOIN PS3_VehicleBooking
                           ON PS3_Vehicle.VehicleID = PS3_VehicleBooking.VehicleID
                    GROUP BY DealerID
                    ) w
         ON h.DealerID = w.DealerID
WHERE  w.VehicleID IS NULL
       AND h.CommittedDate > GETDATE()