Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
Нужно сделать запрос, который я попытался изобразить схематично так
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 выскакивает, в общем-то, естественная ошибка. Но как постоить правильный запрос по другому с соблюдением этого условия.
Спасибо.
8 июн 11, 21:07    [10786014]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
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 что написано?
8 июн 11, 21:27    [10786079]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Слегка ошибся
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 ...
8 июн 11, 21:31    [10786093]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Нет. Всё-таки, мой первый вариант был правильным. Проверьте.
8 июн 11, 21:54    [10786184]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
К сожалению, этот вариант не проходит.
Лучше я приведу запрос целиком

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'
Там, где ошибки выделено жирным шрифтом.
9 июн 11, 10:30    [10787585]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
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'
Там, где ошибки выделено жирным шрифтом.
9 июн 11, 11:40    [10788227]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
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
9 июн 11, 11:42    [10788254]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Использование APPLY
9 июн 11, 11:44    [10788269]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
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 фтопку, а так время не влияет, и неважно есть оно или нет
9 июн 11, 11:58    [10788434]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
>>Minor
Дает ошибку
Incorrect syntax near the keyword 'OUTER'.
Incorrect syntax near the keyword 'ORDER'.
9 июн 11, 13:14    [10789235]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
Наверное, потому, что у меня SQL Server 2000
9 июн 11, 13:22    [10789315]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
Mnior отзовись!!!!!
9 июн 11, 18:47    [10791721]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
zago,

Вы угадали, нету предложения APPLY в 2000.
9 июн 11, 18:52    [10791749]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
zago
Наверное, потому, что у меня SQL Server 2000


именно по етому ,в 2000 етого еще не было
9 июн 11, 18:54    [10791764]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
А почему запрос дает ту же ошибку и в Оракле?
Там его тоже нет?
9 июн 11, 21:52    [10792358]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
zago
Наверное, потому, что у меня SQL Server 2000
Молодца, требования форума не выполняете вовремя.
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
	LEFT JOIN dbo.mal_fiyat_tarih	MFT ON MFT.tarih	= (
		SELECT	Top(1) MFT.tarih
		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)
WHERE	    KFT.tarih >= '20110401'	-- Универсальный формат даты!
	AND KFT.tarih <  '20110406'	-- between фтопку, а так время не влияет, и неважно есть оно или нет
Проверьте, а то всё вслепую.
9 июн 11, 22:05    [10792416]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
zago
Там его тоже нет?
Они движутся в другом направлении.
9 июн 11, 22:10    [10792435]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mnior
SELECT ...
FROM ...
 ...
 ...
	LEFT JOIN dbo.kasa_fis_tanim	KFT ON KFT.satis_no	= KFD.satis_no
 ...
WHERE	    KFT.tarih >= '20110401'	-- Универсальный формат даты!
	AND KFT.tarih <   '20110406'	-- between фтопку, а так время не влияет, и неважно есть оно или нет
Mnior, ну как же так?!
10 июн 11, 14:30    [10796428]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
Mnior, ну как же так?!
Твою дивизию. Баг на баге.
Отвечал только на основной вопрос. Поэтому все ошибки zago (10788227) вообще не просматривал.
К сожалению, так будет часто - мало времени и постоянно отвлекают. В последнее неделю-две вааще ...
Согласен, с ответами на форуме нужно притормозить.
10 июн 11, 20:01    [10799205]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ошибкой в LEFT JOIN  [new]
zago
Member

Откуда:
Сообщений: 54
Решил использовать хранимую функцию.
Всем спасибо.
Тема закрыта.
11 июн 11, 08:31    [10801143]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить