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

Откуда:
Сообщений: 17
Написал запрос...и видимо криво
SELECT [kPos]
      ,[nTransAct]
      ,[DateAct]
      ,[OperT]
      ,[OperC]
      ,[kEmit]
      ,[kClient]
      ,[Ncard]
      ,[Prim]
      ,[kodTransAct]
      ,[Tcard]
      ,[kPr]
      ,IF EXISTS (SELECT TOP 1 ClientPrices.[price] FROM ClientPrices ORDER BY  ClientPrices.[DateTBeg] DESC)
		THEN (SELECT TOP 1 ClientPrices.[price] FROM ClientPrices ORDER BY  ClientPrices.[DateTBeg] DESC)
		ELSE [price]
	   END IF
      ,[kolCard]
      ,[kolTRK]
      ,[InfoMoveDT]
      ,[nMove]
      ,[priceNew]
      ,[KodLimit]
      ,[CurrentAmount]
      ,[sNcard]
  FROM [GasCRD].[dbo].[CrdTransActRegister] TRS
  LEFT JOIN [GasCRD].[dbo].[CRDClientPrices] ClientPrices ON ( ClientPrices.[kClient] = TRS.[kClient] AND ClientPrices.[kPr] = TRS.[kPr] AND ClientPrices.[DateTBeg] < TRS.[DateAct])
  WHERE [kodTransAct] = 1 
Подскажите как надо
7 окт 15, 11:32    [18245511]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
JBoy, конструкцию IF EXISTS внутри запроса нельзя использовать, используйте CASE WHEN ... THEN ... END
7 окт 15, 11:34    [18245522]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
Glory
Member

Откуда:
Сообщений: 104751
JBoy
а если его нет вставить другое поле

Наличие поля проверяют по системной таблицы
А потом уже формируют текст запроса
7 окт 15, 11:34    [18245531]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
JBoy
Member

Откуда:
Сообщений: 17
Glory,
немного не так выразился - вернет ли запрос какой нибудь результат или нет
7 окт 15, 11:38    [18245546]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
JBoy
Member

Откуда:
Сообщений: 17
Minamoto, опять ошибки - неверный синтаксис около END
SELECT [kPos]
      ,[nTransAct]
      ,[DateAct]
      ,[OperT]
      ,[OperC]
      ,[kEmit]
      ,[kClient]
      ,[Ncard]
      ,[Prim]
      ,[kodTransAct]
      ,[Tcard]
      ,[kPr]
      ,
		CASE
			WHEN EXISTS (SELECT TOP 1 ClientPrices.[price] FROM ClientPrices ORDER BY ClientPrices.[DateTBeg] DESC)
			  THEN(SELECT TOP 1 ClientPrices.[price] FROM ClientPrices ORDER BY ClientPrices.[DateTBeg] DESC)
			WHEN  NOT EXISTS (SELECT TOP 1 ClientPrices.[price] FROM ClientPrices ORDER BY ClientPrices.[DateTBeg] DESC)
			  THEN([price]
		END	  
      ,[kolCard]
      ,[kolTRK]
      ,[InfoMoveDT]
      ,[nMove]
      ,[priceNew]
      ,[KodLimit]
      ,[CurrentAmount]
      ,[sNcard]
  FROM [GasCRD].[dbo].[CrdTransActRegister] TRS
  LEFT JOIN [GasCRD].[dbo].[CRDClientPrices] ClientPrices ON ( ClientPrices.[kClient] = TRS.[kClient] AND ClientPrices.[kPr] = TRS.[kPr] AND ClientPrices.[DateTBeg] < TRS.[DateAct])
  WHERE [kodTransAct] = 1
сразу прошу прощения, не особо силен в SQL , но задача поставлена....
7 окт 15, 11:55    [18245646]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
Glory
Member

Откуда:
Сообщений: 104751
ISNULL( ClientPrices.[price], TRS.[price]) AS some_price
7 окт 15, 11:57    [18245656]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
o-o
Guest
да вроде это вообще надо через apply.
в таком духе:
declare @t1 table (id int, price1 int);
insert into @t1 values (1, 10), (2, 20);

declare @t2 table (id int, price2 int, dt date);
insert into @t2 values (1, 5, '20100101'), (1, 6, '20150101');

select t1.*, isnull(a.price2, t1.price1) as price2
from @t1 t1 outer apply (select top 1 price2 from @t2 t2 where t1.id = t2.id order by dt desc)a
-----------------
id	price1	price2
1	10	6
2	20	20

типа если во второй таблице есть цена с макс.датой, то ее выводим, нет -- из первой таблицы берем
7 окт 15, 11:57    [18245659]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
JBoy
Glory,
немного не так выразился - вернет ли запрос какой нибудь результат или нет
Если не вернёт, - будет NULL.
Его легко заменить функцией ISNULL(). Или COALESCE()
Если, конечно, в поле не может храниться NULL...
7 окт 15, 11:57    [18245660]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
JBoy
сразу прошу прощения, не особо силен в SQL , но задача поставлена....
SQL тут не при чём.
Открывающие и закрывающие скобки везде считать надо.
7 окт 15, 11:59    [18245670]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
JBoy
Member

Откуда:
Сообщений: 17
Попробовал вот так
SELECT [kPos]
      ,[nTransAct]
      ,[DateAct]
      ,[OperT]
      ,[OperC]
      ,[kEmit]
      ,[kClient]
      ,[Ncard]
      ,[Prim]
      ,[kodTransAct]
      ,[Tcard]
      ,[kPr]
      ,ISNULL(ClnPrice.[price],TRS.[price]) as ЦЕНА 
      ,[kolCard]
      ,[kolTRK]
      ,[InfoMoveDT]
      ,[nMove]
      ,[priceNew]
      ,[KodLimit]
      ,[CurrentAmount]
      ,[sNcard]
  FROM [GasCRD].[dbo].[CrdTransActRegister] TRS
  OUTER APPLY (SELECT TOP 1 [price] 
				FROM [GasCRD].[dbo].[CRDClientPrices] ClientPrices 
				WHERE (ClientPrices.[kClient] = TRS.[kClient] 
						AND ClientPrices.[kPr] = TRS.[kPr] 
						AND ClientPrices.[DateTBeg] < TRS.[DateAct]) 
				ORDER BY ClientPrices.[DateTBeg] DESC)  AS ClnPrice
  WHERE [kodTransAct] = 1 

В итоге
Сообщение 156, уровень 15, состояние 1, строка 24
Incorrect syntax near the keyword 'OUTER'.
Сообщение 156, уровень 15, состояние 1, строка 29
Incorrect syntax near the keyword 'ORDER'.
7 окт 15, 12:39    [18245974]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
_djХомяГ
Guest
А версия сервера + (режим совместимости) какой?
Быть может OUTER APPLY просто нелья использовать
7 окт 15, 12:50    [18246068]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
JBoy
Member

Откуда:
Сообщений: 17
_djХомяГ, 8.00.760, SQL SERVER 2000(80)
7 окт 15, 13:01    [18246158]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
o-o
Guest
запрос с apply выполняется в базе с уровнем совместимости 80,
так что остается версия сервера <= 2000. не повезло
7 окт 15, 13:03    [18246166]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
o-o
не повезло
Почему?
Что мешает поставить весь подзапрос в ISNULL() в поле SELECTа?
7 окт 15, 13:06    [18246187]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
o-o
Guest
SELECT [kPos]
      ,[nTransAct]
      ,[DateAct]
      ,[OperT]
      ,[OperC]
      ,[kEmit]
      ,[kClient]
      ,[Ncard]
      ,[Prim]
      ,[kodTransAct]
      ,[Tcard]
      ,[kPr]
      ,ISNULL(ClnPrice.[price],(SELECT TOP 1 [price] 
				FROM [GasCRD].[dbo].[CRDClientPrices] ClientPrices 
				WHERE (ClientPrices.[kClient] = TRS.[kClient] 
						AND ClientPrices.[kPr] = TRS.[kPr] 
						AND ClientPrices.[DateTBeg] < TRS.[DateAct]) 
				ORDER BY ClientPrices.[DateTBeg] DESC)) as ЦЕНА 
      ,[kolCard]
      ,[kolTRK]
      ,[InfoMoveDT]
      ,[nMove]
      ,[priceNew]
      ,[KodLimit]
      ,[CurrentAmount]
      ,[sNcard]
  FROM [GasCRD].[dbo].[CrdTransActRegister] TRS
  WHERE [kodTransAct] = 1 
7 окт 15, 13:07    [18246194]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
JBoy
Member

Откуда:
Сообщений: 17
o-o, немного не туда подставили, но идея ясна, сейчас попробую
7 окт 15, 13:11    [18246231]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
o-o
Guest
iap
o-o
не повезло
Почему?
Что мешает поставить весь подзапрос в ISNULL() в поле SELECTа?

безотносительно запроса не повезло.
при всем моем уважении к динозаврам
7 окт 15, 13:12    [18246249]     Ответить | Цитировать Сообщить модератору
 Re: Подцепить поле из другой таблицы по условию, а если его нет вставить другое поле  [new]
JBoy
Member

Откуда:
Сообщений: 17
Спасибо всем, все получилось...
7 окт 15, 13:22    [18246321]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить