2013-12-08 4 views
1

что не так с этим запросом? эти таблицы я using-sql server внутренний запрос соединения не выполняется

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 
); 

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 
); 

SELECT DealerID, PS3_Vehicle.VehicleID, VehicleName, StartDate, EndDate 
FROM PS3_Vehicle 
INNER JOIN PS3_VehicleBooking ON PS3_Vehicle.VehicleID != PS3_VehicleBooking.VehicleID AS W 
INNER JOIN PS3_Dealer ON W.DealerID = PS3_Dealer.DealerID 
    AND CommittedDate > GETDATE(); 
+0

Каков ваш желаемый результат? –

+0

В вашем 1-м внутреннем соединении у вас есть = = в разделе «ВКЛ» ??? Также есть неоднозначность названия столбца для DealerID в инструкции Select, поскольку этот столбец присутствует в более чем одной таблице с тем же именем –

+0

идентификатор транспортного средства дилера, которого нет в таблице транспортных средств, но я хочу в столбцах даты начала и окончания даты, также содержащих ничего – user3054094

ответ

0

попробовать это:

SELECT w.DealerID, w.VehicleID, w.VehicleName, b.StartDate, b.EndDate 
FROM PS3_Vehicle w 
INNER JOIN PS3_VehicleBooking b ON w.VehicleID != b.VehicleID 
INNER JOIN PS3_Dealer d ON W.DealerID = d.DealerID 
    AND CommittedDate > GETDATE(); 

http://sqlfiddle.com/#!3/8f5c0/6

1

Я думаю, что вы могли бы сделать это с простой LEFT JOIN между PS3_Vehicle и PS3_VehicleBooking где PS3_VehicleBooking не имеет соответствия для этого транспортного средства:

SELECT v.DealerID, v.VehicleID, v.VehicleName, vb.StartDate, vb.EndDate 
FROM PS3_Vehicle v 
LEFT JOIN PS3_VehicleBooking vb ON v.VehicleID = vb.VehicleID 
WHERE vb.VehicleID IS NULL 

Это даст вам транспортные средства, которые не присутствует в PS3_VehicleBooking, что делает startDate и endDate всегда NULL

0
SELECT v.DealerID, v.PS3_Vehicle.VehicleID, v.VehicleName, b.StartDate, b.EndDate 
FROM PS3_Vehicle v 
Left JOIN PS3_VehicleBooking b ON v.VehicleID = b.VehicleID 
INNER JOIN PS3_Dealer d ON v.DealerID = d.DealerID 
Where b.VehicleID is null 
AND d.CommittedDate > GETDATE() 

Дадут вам все незарегистрированные транспортные средства и инфор о дилере, который не занимался их ..

Ps когда вы начинаете делать подобные запросы, полностью квалифицируйте все свои имена с псевдонимами или именами таблиц, что значительно облегчает работу следующего разработчика.

Oh и startdate и enddate всегда будут иметь значение null в этом запросе, и поэтому бессмысленны.

0
SELECT D.DealerID, V.VehicleID, V.VehicleName, vb.StartDate, vb.EndDate 
FROM PS3_Dealer D LEFT JOIN PS3_Vehicle V 
ON D.DealerID = V.DealerID 
LEFT JOIN PS3_VehicleBooking vb 
ON V.VehicleID = VB.V.VehicleID 
WHERE vb.V.VehicleID IS NULL 
AND CommittedDate > GETDATE(); 
Смежные вопросы