2013-12-17 4 views
0

Сначала я объясню концепцию таблиц ..
У меня есть 3 таблицы, A, B и CSQL Server 2005 и .net запрос

таблица А содержит старые и новые номера лицензии, а также дата когда водитель изменил новую лицензию

таблица а содержит

fdate      | oldLicense (varchar) | newLicense (varchar) 
12/14/2013 4:16:16 PM  | 2      | 3 

В таблице B указаны номер лицензии ID, а также в первый день, когда они использовали автомобиль. Обратите внимание, что 12/14/2013 введен новый номер лицензии, что означает, что драйверы были изменены на автомобиле (, потому что старый не может больше ездить или умер).

Таблица Б содержит

ID_Car | licenseNumber | fDate 
44  | 2    | 12/9/2013 4:16:16 AM 
44  | 3    | 12/14/2013 4:16:16 PM 

Таблица С является поддержание производится на автомобиле. Обратите внимание, что он имеет даты, он должен отражать, когда драйверы изменены.
Например, на 12/9/2013 водительские права еще 2, а на 12/15/2013 лицензии уже 3.

таблица C содержит

Invoice | ID_Car | fDate 
00989  | 44  | 12/9/2013 5:00:00 AM 
10100  | 44  | 12/9/2013 6:00:00 AM 
32323  | 44  | 12/15/2013 12:00:00 AM 

Желаемая выход :

C.Invoice | A.Licenses (old and new?) 
00989  | 2 
10100  | 2 
32323  | 3 

То, что я пытался до сих пор:

SELECT B.fInvoice, C.fLicenseNew 
FROM tblCarFranchise A 
LEFT JOIN tblCarMaintenance B ON A.ID_Car = B.ID_Car 
LEFT JOIN tblTaxiDriversRelation C ON A.fLicenseNumber = C.fLicenseNew 

Выход:

00989  | NULL 
10100  | NULL 
32323  | NULL 
00989  | 3 
10100  | 3 
32323  | 3 

Я действительно не знаю, как я должен начать это, это может быть самый сложный запрос, который я столкнулся до сих пор, также строки как-то дублируется (в общей сложности 6 строк вместо 3 строк)

Помощь T_T

UPDATE: @Szymon Thnx за помощь, а также к kumarch1
на изображении, номер лицензия 222333 = 2 (по вопросу) и 13213113 = 3 Added tables

+0

проверка ответа определено ниже –

+0

изменения от <> к! = –

ответ

1

После осветления , это будет ваш запрос. Он находит изменение лицензии на основе даты.

select C.fInvoice, B.fLicenseNumber 
from tblCarMaintenance C 
inner join tblCarFranchise B 
on C.ID_Car = B.ID_Car 
and C.fDate >= B.fdate 
and C.fDate < isnull((select top 1 fDate from tblCarFranchise M where M.fdate > B.fdate 
       and M.ID_Car = B.ID_Car), '20991231') 

SQL Fiddle demo

+0

вы можете сказать мне, что «20991231» означает по запросу? – Codemunkeee

+0

Дата в далеком будущем. Я сопоставляю счета-фактуры между изменениями лицензий, и именно так я нахожу последнюю лицензию (она находится между последним изменением и 2099 годом. – Szymon

+1

oh okay thanks :) он работает над скрипкой, но я все еще настраиваю код работать на сервере sql и на моем коде. Я отвечу на это, как только я получу его :) – Codemunkeee

0

сохранить ваши данные в храме темпа и извлекать данные из временной таблицы без нулевой

Select temp.fInvoice ,temp.fLicenseNew from(SELECT B.fInvoice as fInvoice , C.fLicenseNew as fLicenseNew 
FROM tblCarFranchise A 
LEFT JOIN tblCarMaintenance B ON A.ID_Car = B.ID_Car 
LEFT JOIN tblTaxiDriversRelation C ON A.fLicenseNumber = C.fLicenseNew) temp 
where temp.fLicenseNew != null 
+0

спасибо братан, но ни одна строка не были возвращены .. хмм – Codemunkeee

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