Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
На следующий код
use bd_740;
update a
set a.KRA_INT = d.HA+(c.H2-b.H1)*(a.KR_int-(b.H1-d.HA))/(c.H2-e.HA-b.H1+d.HA) - f.ALT_R
from perf a 
left join 
(select top 1 idskv, H as H1 from inca where inca.idskv=a.idskv and H<a.KR_int order by H1 desc) b on b.idskv=a.idskv
left join
(select top 1 idskv, H as H2 from inca where inca.idskv=a.idskv and H>a.KR_int order by H2 desc) c on с.idskv=a.idskv
left join 
 inca d on d.idskv=a.idskv and d.H=b.H1 
left join  
 inca e on e.idskv=a.idskv and e.H=c.H2
left join  
 BSKV  f on f.idskv=a.idskv where a.RO_SRD>0


компилятор ругается с ошибками
Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "a.idskv" could not be bound.
Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "a.KR_int" could not be bound.
Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "a.idskv" could not be bound.
Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "a.KR_int" could not be bound.
Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "с.idskv" could not be bound.
29 мар 12, 15:08    [12334152]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,
вот что получилось:
update a 
set a.KRA_INT=b.H1+(c.H2-b.H1)*(a.KR_INT-d.HA)/(e.HA-d.HA)- f.ALT_R
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by IDSKV,H2 ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
left join 
BSKV f on f.IDskv=a.IDskv
where a.RO_SRD>0
29 мар 12, 15:14    [12334219]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

забыл добавить сортировку в с,если праильно понял постановку задачи
update a 
set a.KRA_INT=b.H1+(c.H2-b.H1)*(a.KR_INT-d.HA)/(e.HA-d.HA)- f.ALT_R
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by IDSKV,H2 ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
left join 
BSKV f on f.IDskv=a.IDskv
where a.RO_SRD>0


а скриптов на создание и заполнение вполне хватило бы таких:
CREATE TABLE [dbo].[PERF](
 [IDSKV] [int] NOT NULL,
 [KR_INT] [float] NOT NULL,
 [POD_INT] [float] NOT NULL,
 [KRA_INT] [float] NULL,
 [RO_SRD] [float] NULL,
 )
 
 insert into [PERF](IDSKV,   KR_INT, POD_INT, KRA_INT,  RO_SRD)
 select 20100021 ,3821, 3834, NULL,  0.1 union all
select 20100021, 3830, 3847, NULL , 0.1 union all
select 20100021, 3758, 3770, NULL,  0.1  union all
select 20100021, 3719, 3728, NULL , 0.1  union all
select 20100021, 3748, 3756, NULL,  0.1  union all
select 20100035, 3693, 3744, NULL,  0.1  union all
select 20100035, 3752, 3787, NULL,  0.1  union all
select 20100035, 3798, 3825, NULL,  0.1  union all
select 20100719, 3774, 3780, NULL,  0.1  union all
select 20100719, 3750, 3757, NULL,  0.1  union all
select 20100719, 3802, 3812, NULL,  0.1 


CREATE TABLE [dbo].[INCA](
 [IDSKV] [int] NOT NULL,
 [H] [float] NOT NULL,
 [HA] [float] NULL
)
insert into [INCA] (IDSKV, H ,HA)
select 20100020, 0 ,53.2 union all
select 20100020, 3900, -3846.8 union all
select 20100021, 0, 53.4 union all
select 20100021, 20, 33.4 union all
select 20100021, 40, 13.4 union all
select 20100021, 60, -6.6 union all
select 20100021, 80, -26.6 union all
select 20100021, 100, -46.6 union all
select 20100021, 120, -66.6 union all
select 20100021, 140, -86.6 union all
select 20100021, 160, -106.6 union all
select 20100021, 180, -126.6 union all
select 20100021, 200, -146.6 union all
select 20100021, 220, -166.6 union all
select 20100021, 240, -186.6 union all
select 20100021, 260, -206.6


все поля таблиц и комментарии тут знать не нужно
29 мар 12, 15:23    [12334316]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

Сергей, спасибо.
Компиляция вашего скрипта выдавала ошибку Ambiguous column name 'IDSKV'.
Я доgисал perf.idskv . Ошибка пропала. Еще я формулу немного подправил под правильный вариант.

update a 
set a.KRA_INT=d.HA+(e.HA-d.HA)*(a.KR_INT-b.H1)/(c.H2-b.H1)- f.ALT_R
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by perf.IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by perf.IDSKV,H2 ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
left join 
BSKV f on f.IDskv=a.IDskv
where a.RO_SRD>0


Но ничего не записалось, хотя вышло сообщение что 39 row(s) affected)
29 мар 12, 15:42    [12334475]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А если c.H2 = b.H1, то что будет?
Oilboy, почитайте про NULL в выражениях
29 мар 12, 15:45    [12334496]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
iap
А если c.H2 = b.H1, то что будет?
Oilboy, почитайте про NULL в выражениях

Да будет деление на ноль, исключил эту ситуацию добавив в знаменатель слагаемое 0,0000000001.
29 мар 12, 15:51    [12334550]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
Oilboy,

но все равно запись значение не происходит, =((
29 мар 12, 15:52    [12334554]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
SomewhereSomehow
Member

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

замените кусок
update a 
set a.KRA_INT=d.HA+(e.HA-d.HA)*(a.KR_INT-b.H1)/(c.H2-b.H1)- f.ALT_R
...

на
select
	a.KRA_INT,
	d.HA+(e.HA-d.HA)*(a.KR_INT-b.H1)/(c.H2-b.H1)- f.ALT_R
...

и посмотрите, что на что у вас заменяется.
29 мар 12, 16:08    [12334712]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

апдейта не произошло по причине того что результирущее значение формулыв которой хотя бы одно поле = null будет так же null

update a 
set a.KRA_INT=IsNull(b.H1,0)+(IsNull(c.H2,0)-IsNull(b.H1,0))*(IsNull(a.KR_INT,0)-IsNUll(d.HA,0))/(IsNull(e.HA,0)-IsNull(d.HA,0)) - IsNull(f.ALT_R,0)
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by perf.IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by perf.IDSKV,H2 ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
left join 
BSKV f on f.IDskv=a.IDskv
where a.RO_SRD>0
29 мар 12, 16:11    [12334745]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
SomewhereSomehow
Oilboy,

замените кусок
update a 
set a.KRA_INT=d.HA+(e.HA-d.HA)*(a.KR_INT-b.H1)/(c.H2-b.H1)- f.ALT_R
...

на
select
	a.KRA_INT,
	d.HA+(e.HA-d.HA)*(a.KR_INT-b.H1)/(c.H2-b.H1)- f.ALT_R
...

и посмотрите, что на что у вас заменяется.


То что вы просили вывести, там по NULL.
Начал выводить что у меня там присваивается, обнаружил, что a.h1 строго все NULL. Не пойму почему так происходит..
29 мар 12, 16:14    [12334764]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

select b.H1
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by perf.IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by perf.IDSKV,H2 ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
left join 
BSKV f on f.IDskv=a.IDskv
where a.RO_SRD>0

Сергей, данный селект выводит строго NULL!!!
29 мар 12, 16:25    [12334848]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

он выводит Null по причине того что результирущее значение формулыв которой хотя бы одно поле = null будет так же null
выход - каждое поле в случае null заменять на 0

update a 
set a.KRA_INT=IsNull(b.H1,0)+(IsNull(c.H2,0)-IsNull(b.H1,0))*(IsNull(a.KR_INT,0)-IsNUll(d.HA,0))/(IsNull(e.HA,0)-IsNull(d.HA,0)) - IsNull(f.ALT_R,0)
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by perf.IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by perf.IDSKV,H2 ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
left join 
BSKV f on f.IDskv=a.IDskv
where a.RO_SRD>0
29 мар 12, 16:28    [12334864]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

я уже не об апдейте говорю, я сделал селект по параметру b.h1,c.h2 - и там строго нули!!!
29 мар 12, 16:31    [12334893]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

а такие селекты что-то возвращают ?
select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT 
order by perf.IDSKV,H1 desc 

select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT order by perf.IDSKV,H2
29 мар 12, 16:38    [12334940]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

они возвращают две одинаковые строчки. Первая правильная, вторая не правильная... кажется я понял, нужно условие where ro_srd>0 еще и внутри подзапросов написать!!
29 мар 12, 16:43    [12334980]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

Короче что нужно запрос не выполняет!!
29 мар 12, 17:04    [12335142]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

Селекты b.h1 и c.h2 в любом случае дают NULL!! Почему, не понятно!!
29 мар 12, 17:23    [12335330]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

давай смотреть на моих данных
select * from perf

результат:
IDSKV KR_INT POD_INT KRA_INT RO_SRO
20100021 3821 3834 NULL 0.1
20100021 3830 3847 NULL 0.1
20100021 3758 3770 NULL 0.1
20100021 3719 3728 NULL 0.1
20100021 3748 3756 NULL 0.1
20100035 3693 3744 NULL 0.1
20100035 3752 3787 NULL 0.1
20100035 3798 3825 NULL 0.1
20100719 3774 3780 NULL 0.1
20100719 3750 3757 NULL 0.1
20100719 3802 3812 NULL 0.1
select * from inca

IDSKV H HA
20100020 0 53.2
20100020 3900 -3846.8
20100021 0 53.4
20100021 20 33.4
20100021 40 13.4
20100021 60 -6.6
20100021 80 -26.6
20100021 100 -46.6
20100021 120 -66.6
20100021 140 -86.6
20100021 160 -106.6
20100021 180 -126.6
20100021 200 -146.6
20100021 220 -166.6
20100021 240 -186.6
20100021 260 -206.6

select a.*,b.H1, c.H2
from perf a 
left join 
(select top 1 perf.IDSKV, H as H1 from   perf  left join inca on perf.idskv =inca.idskv and H<KR_INT where RO_SRD>0
order by perf.IDSKV,H1 desc ) b on b.IDskv=a.IDskv
left join
(select top 1 perf.IDSKV as IDSKV, H as H2 from perf left join inca on perf.idskv =inca.idskv 
and H>KR_INT where RO_SRD>0 order by perf.IDSKV,H2 desc ) c on c.IDskv=a.IDskv
left join 
inca  d on d.IDskv=a.IDskv and d.H=b.H1 
left join 
inca e on e.IDskv=a.IDskv and e.H=c.H2
where a.RO_SRD>0

IDSKV KR_INT POD_INT KRA_INT RO_SRO H1 H2

20100021 3821 3834 NULL 0.1 260 NULL
20100021 3830 3847 NULL 0.1 260 NULL
20100021 3758 3770 NULL 0.1 260 NULL
20100021 3719 3728 NULL 0.1 260 NULL
20100021 3748 3756 NULL 0.1 260 NULL
20100035 3693 3744 NULL 0.1 NULL NULL
20100035 3752 3787 NULL 0.1 NULL NULL
20100035 3798 3825 NULL 0.1 NULL NULL
20100719 3774 3780 NULL 0.1 NULL NULL
20100719 3750 3757 NULL 0.1 NULL NULL
20100719 3802 3812 NULL 0.1 NULL NULL

что тут не так?
29 мар 12, 17:26    [12335372]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

С твоими данными все нормально получается. Куда мне тебе мои таблицы скинуть давай я их в эксель залью и на почту, вот посмотришь что выдаст...
29 мар 12, 17:34    [12335449]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

давай сливай...тока не все поля а необходимые...
29 мар 12, 17:38    [12335473]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

уже со всеми отправил, сори, но необходимы я подписал только=))
29 мар 12, 17:39    [12335484]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors,

Сергей, короче у меня последний твой запрос выводит не корректные h1 и h2 три пары, а остальные NULL. Что у тебя получилось??
29 мар 12, 18:02    [12335673]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

ну во-первых
по табл perf - не подписал поле RO_SRD вместо этого задвоил поле POD_INT
кто из них кто знать не могу
29 мар 12, 18:16    [12335779]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
GeneralMotors
Member

Откуда:
Сообщений: 85
Oilboy,

во-вторых
в табл inca реально есть только IDSKV = 79700159,79700177,79700261,79701013
для остальных IDSKV из perf нет сооттветсвующих IDSKV в inc....НЕТ!!! потому там null
для IDSKV = 79700159,79700177,79700261 нашлись требуемые значения H1 и H2 ...
для 79701013 не нашлось, потому там тоже нулл


скажи честно, это твой первый день в sql?
29 мар 12, 18:23    [12335829]     Ответить | Цитировать Сообщить модератору
 Re: запрос из двух таблиц  [new]
Oilboy
Member

Откуда:
Сообщений: 170
GeneralMotors
Oilboy,

ну во-первых
по табл perf - не подписал поле RO_SRD вместо этого задвоил поле POD_INT
кто из них кто знать не могу

Прошу прощения, RO_SRD - следующее поле после POD_INT - его я не задвоил, оно просто аналогично KR_INT будет считаться!!
29 мар 12, 18:26    [12335853]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить