Запрос с ошибкой в LEFT JOIN

zago
Дата: 08.06.2011 21:07:45
Нужно сделать запрос, который я попытался изобразить схематично так
SELECT t1.Fld1,t2.Fld4,t2.Fld9,t3.Fld3
FROM Table1 t1
LEFT JOIN Table2 t2 ON (t2.Fld4=t1.Fld5)
LEFT JOIN (SELECT Fld3,Fld6 FROM Table3 WHERE Fld8=t2.Fld9) t3 ON (t3.Fld6=t1.Fld7)
WHERE ...
ORDER BY ...
В четвертой строке на Fld8=t2.Fld9 выскакивает, в общем-то, естественная ошибка. Но как постоить правильный запрос по другому с соблюдением этого условия.
Спасибо.
iap
Дата: 08.06.2011 21:27:46
zago
Нужно сделать запрос, который я попытался изобразить схематично так
SELECT t1.Fld1,t2.Fld4,t2.Fld9,t3.Fld3
FROM Table1 t1
LEFT JOIN Table2 t2 ON (t2.Fld4=t1.Fld5)
LEFT JOIN (SELECT Fld3,Fld6 FROM Table3 WHERE Fld8=t2.Fld9) t3 ON (t3.Fld6=t1.Fld7)
WHERE ...
ORDER BY ...
В четвертой строке на Fld8=t2.Fld9 выскакивает, в общем-то, естественная ошибка. Но как постоить правильный запрос по другому с соблюдением этого условия.
Спасибо.
SELECT t1.Fld1,t2.Fld4,t2.Fld9,t3.Fld3
FROM Table1 t1
LEFT JOIN Table2  t2 ON t2.Fld4=t1.Fld5
LEFT JOIN Table3 t3 ON t3.Fld8=t2.Fld9 AND t3.Fld6=t1.Fld7
WHERE ...
ORDER BY ...
А в WHERE что написано?
iap
Дата: 08.06.2011 21:31:22
Слегка ошибся
SELECT t1.Fld1,t2.Fld4,t2.Fld9,t3.Fld3
FROM Table1 t1
LEFT JOIN Table2 t2
     JOIN Table3 t3 ON t2.Fld9=t3.Fld8
ON t1.Fld5=t2.Fld4 AND t1.Fld7=t3.Fld6
WHERE ...
ORDER BY ...
iap
Дата: 08.06.2011 21:54:28
Нет. Всё-таки, мой первый вариант был правильным. Проверьте.
zago
Дата: 09.06.2011 10:30:30
К сожалению, этот вариант не проходит.
Лучше я приведу запрос целиком

select kfd.mal_no,mt.mal_adi,kfd.miktar,cari_no,ct.cari_adi,kft.tarih,
kft.birim_no,kft.kasa_no,kft.net_alis_fiyat,kft.satis_fiyat,
mft.satis_fiyat,mft.net_alis_fiyat
from kasa_fis_detay kfd
left join mal_tanim mt on (mt.mal_no=kfd.mal_no)
left join cari_tanim ct on (ct.cari_no=mt.cari_no)
left join kasa_fis_tanim kft on (kft.satis_no=kfd.satis_no)
left join (select tarih,mal_no,satis_fiyat,net_alis_fiyat
from mal_fiyat_tarih
where tarih=(select MAX(mft.tarih)
from mal_fiyat_tarih
where fiyat_tip_kod='P' and mal_no=kfd.mal_no and tarih<=kft.tarih)) mft on (mft.mal_no=kfd.malno_no)
where kft.tarih between '01042011' and '05042011'
Там, где ошибки выделено жирным шрифтом.
Mnior
Дата: 09.06.2011 11:40:38
zago, используй б...ь SRC
zago
К сожалению, этот вариант не проходит.
Лучше я приведу запрос целиком

select kfd.mal_no,mt.mal_adi,kfd.miktar,cari_no,ct.cari_adi,kft.tarih,
         kft.birim_no,kft.kasa_no,kft.net_alis_fiyat,kft.satis_fiyat,
         mft.satis_fiyat,mft.net_alis_fiyat
from kasa_fis_detay kfd
left join mal_tanim mt on (mt.mal_no=kfd.mal_no)
left join cari_tanim ct on (ct.cari_no=mt.cari_no)
left join kasa_fis_tanim kft on (kft.satis_no=kfd.satis_no)
left join (select tarih,mal_no,satis_fiyat,net_alis_fiyat 
           from mal_fiyat_tarih 
           where tarih=(select MAX(mft.tarih) 
                             from mal_fiyat_tarih 
                             where fiyat_tip_kod='P' and mal_no=[b]kfd.mal_no[/b] and tarih<=[b]kft.tarih[/b])) mft on (mft.mal_no=kfd.malno_no)
where kft.tarih between '01042011' and '05042011'
Там, где ошибки выделено жирным шрифтом.
Mnior
Дата: 09.06.2011 11:42:58
zago
К сожалению, этот вариант не проходит.
Лучше я приведу запрос целиком

select kfd.mal_no,mt.mal_adi,kfd.miktar,cari_no,ct.cari_adi,kft.tarih,
         kft.birim_no,kft.kasa_no,kft.net_alis_fiyat,kft.satis_fiyat,
         mft.satis_fiyat,mft.net_alis_fiyat
from kasa_fis_detay kfd
left join mal_tanim mt on (mt.mal_no=kfd.mal_no)
left join cari_tanim ct on (ct.cari_no=mt.cari_no)
left join kasa_fis_tanim kft on (kft.satis_no=kfd.satis_no)
left join (select tarih,mal_no,satis_fiyat,net_alis_fiyat 
           from mal_fiyat_tarih 
           where tarih=(select MAX(mft.tarih) 
                             from mal_fiyat_tarih 
                             where fiyat_tip_kod='P' and mal_no=kfd.mal_no and tarih<=kft.tarih)) mft on (mft.mal_no=kfd.malno_no)
where kft.tarih between '01042011' and '05042011'
Там, где ошибки выделено жирным шрифтом.
OUTER APPLY
Mnior
Дата: 09.06.2011 11:44:28
Mnior
Дата: 09.06.2011 11:58:29
SELECT	 KFD.mal_no
	,MT.mal_adi
	,KFD.miktar
	,KFD.cari_no	-- Алиасы!
	,CT.cari_adi
	,KFT.tarih
	,KFT.birim_no
	,KFT.kasa_no
	,KFT.net_alis_fiyat
	,KFT.satis_fiyat
	,MFT.satis_fiyat
	,MFT.net_alis_fiyat
FROM	          dbo.kasa_fis_detay	KFD	-- Схемы!
	LEFT JOIN dbo.mal_tanim		MT  ON MT.mal_no	= KFD.mal_no
	LEFT JOIN dbo.cari_tanim	CT  ON CT.cari_no	= MT.cari_no
	LEFT JOIN dbo.kasa_fis_tanim	KFT ON KFT.satis_no	= KFD.satis_no
	OUTER APPLY (
		SELECT	Top(1)	-- Проще! (если угадал)
			 MFT.tarih
			,MFT.mal_no
			,MFT.satis_fiyat
			,MFT.net_alis_fiyat
		FROM	dbo.mal_fiyat_tarih	MFT
		WHERE	    MFT.fiyat_tip_kod	 = 'P'
			AND MFT.mal_no		 = KFD.malno_no
			AND MFT.mal_no		 = KFD.mal_no
			AND MFT.tarih		<= KFT.tarih
		ORDER BY MFT.tarih DESC)MFT
WHERE	    KFT.tarih >= '20110401'	-- Универсальный формат даты!
	AND KFT.tarih <  '20110406'	-- between фтопку, а так время не влияет, и неважно есть оно или нет
zago
Дата: 09.06.2011 13:14:52
>>Minor
Дает ошибку
Incorrect syntax near the keyword 'OUTER'.
Incorrect syntax near the keyword 'ORDER'.