2014-10-01 3 views
0

У меня есть два стола, автомобиль и чтение.sql server join возвращают только одну строку из второй таблицы

АВТОМОБИЛЯ ТАБЛИЦА

VehicleIdИмяInitialReading

  1. ABC 584
  2. XYZ 900

ЧТЕНИЕ TABLE

ReadingIdДатаСдвигVehicleIdЧтение

  1. 2014-09-01 1 1 1234
  2. 2014-09-01 2 1 2230
  3. 2014-09-02 1 1 2500
  4. 2014-09-02 2 1 3004
  5. 2014-09-03 2 1 5000
  6. 2014-09-03 1 1 4000
  7. 2014-09-01 1 2 1000

Теперь я у меня проблема с объединением показаний. Я ищу таблицу для таблицы VehicleId

например, VehicleId=1, то выход должен быть в следующем формате.

Date Shift OpeningReading ClosingReading

2014-09-01 1 584 1234 (if there are no opening for this date, I have to fetch the initial reading) 
2014-09-01 2 1234 2230  
2014-09-01 1 2230 2500 
2014-09-01 2 2500 3004 
2014-09-01 1 3004 4000 
2014-09-01 2 4000 5000 

Я попытался это с CROSS ОТНОСИТЬСЯ

create table vehicle(vehicleId int identity(1,1),name varchar(25),initialReading int); 
insert into vehicle values('ABC',584),('XYZ',900); 


create table reading (readingId int identity(1,1),[date] date,vehicleId int,shiftId int,reading int); 
insert into reading values ('2014-09-01',1,1,1234),('2014-09-01',1,2,2230), ('2014-09-02',1,1,2500),('2014-09-02',1,2,3004),('2014-09-03',1,2,5000),('2014-09-03',1,1,4000); 

SQLFiddle of the said experiment

+0

Возможно, ваша проблема связана с крестом? http://sqlserverplanet.com/sql-2005/cross-apply-explained, когда я читаю, что мне кажется, что cross apply также (? Optional?) Создает группу, которая могла бы объяснить, почему только один результат есть (делать это как комментарий, а не ответ, поскольку я не уверен там) – Thomas

+0

Как я уже сказал в вопросе, когда мы рассматриваем дату, мне нужно последнее введенное чтение перед этой датой в качестве начального чтения. Поэтому результат будет неправильным, если я выберу больше строки. – Sajeel

ответ

0

Уже у вас есть две таблицы .. Теперь вы хотите комбинируя два стола, где Vehicle ID = 1

just Использовать Sub Query

select R.Date R.Shift,(select V.Initial Reading From Vehicle V where v.Vehicle id =R.Vehicle Id) as Initial Reading , R.Reading as Closing Reading from Reading Where Vehicle [email protected] id 

or 

set @Vehicle id=1 

select R.Date R.Shift,(select V.Initial Reading From Vehicle V where v.Vehicle id =R.Vehicle Id) as Initial Reading , R.Reading as Closing Reading from Reading Where Vehicle id=1 
+0

Я не объединяю две таблицы, я извлекаю показания открытия и закрытия из той же таблицы. Проверьте требуемый выход.Я вхожу в день и сдвигаю мудрое чтение в том же столе. Если нет показаний открытия, т. Е. Для первого ввода в таблице я должен получить начальное показание из таблицы транспортных средств. – Sajeel

Смежные вопросы