Поместите значения из одной строки в другие строки в поле зрения

#sql #sql-server

Вопрос:

У меня есть представление (V1), которое выглядит так с исходной таблицей T1:

Номер Тип Ценность
1 Автомобиль 0,05
2 Автомобиль 0,08
1 стол 0,01
2 стол 0,07

В принципе, я хочу скопировать все значения с номером 1 во все строки одного и того же типа.

Номер Тип Ценность Новое значение
1 Автомобиль 0,05 0,05
2 Автомобиль 0,08 0,05
1 стол 0,01 0,01
2 стол 0,07 0,01

Я нашел решение, которое действительно работает:

 Alter View V1 AS

Select *, map.New_Value from T
left Join (Select * from T1 Where Number = 1)map ON T.Type = map.Type
 

К сожалению, мне приходится повторять этот шаг несколько раз после того, как я сделал расчеты на основе самостоятельного соединения раньше. В результате мне пришлось бы корректировать код следующим образом

 Alter View V1 AS
Select *, map3.another_new_Value
from(
Select *, map.New_Value from T
left Join (Select * from T1 Where Number = 1)map ON T.Type = map.Type) map2


left Join (Select * from T1 Where Number = 1)map3 ON map2.Type = map3.Type
 

В результате мой код растет в геометрической прогрессии… Мне нужно повторить это 10 раз.
Единственный способ справиться с grwoth с помощью этой процедуры-создать несколько представлений.

Вот почему я хотел спросить, есть ли у кого-нибудь идея, как заполнить поле New_Value без использования самостоятельного соединения.

Возможно, еще одна полезная информация: Значение строк с номером 1 всегда является самым низким значением для этого типа.

кр.

Комментарии:

1. Почему бы просто не воспользоваться FIRST_VALUE ?

2. Неясно, когда вы читаете свой вопрос, где находится исходная таблица T /.

Ответ №1:

Почему бы не использовать:

 Select 
   T1.*, 
   T2.Number as New_Value
from T1
left Join T1 as T2 on T1.Type=T2.Type and T2.Number=1
 

Выше предполагается, что каждый Type как строка с числом=1, так left join что на самом деле это может быть an inner join .

Но, поскольку я все еще использую left join , вы увидите NULL значение для типов, у которых нет строки Number=1.

(То, как NULL отображается значение, зависит от клиента, которого вы используете)

Ответ №2:

Попробуйте это :

 Alter View V1 AS

Select *, (SELECT VALUE FROM T WHERE T.TYPE=ALIAS.TYPE AND NUMBER=1) AS NEWVALUE from T ALIAS

 

Если существует возможность наличия нескольких записей с ЧИСЛОМ=1 для определенного типа, вы можете использовать max(ЗНАЧЕНИЕ) в подзапросе select.