#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.