Почему цикл while не проходит через коллекцию? - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть 2 таблицы.

InspectionUTG и InspectionHistoryUTGTML.

select distinct InspectionUTGID
from InspectionHistoryUTG

Возвращает

5196
5197
5198
5199
5200

- шаг 2: получить один идентификатор, например: 5260, результат выше

select top 1 UserTmin, RLTMin
from InspectionHistoryUTGTML
where InspectionUTGID = 5260 and RLTMin is not null
order by RLTMin 

- шаг 3: получить UserTmin, возвращенный из вышеприведенного запроса, т. Е. 33.17, и использовать его ниже против TMin в следующем запросе

update InspectionHistoryUTG set
  TMin = 33.17
where InspectionUTGID = 5260

Теперь я сделал

create table #TableInspectionsUTGs
(
    InspectionUTGID int
)

Insert into #TableInspectionsUTGs
  select distinct InspectionUTGID from InspectionHistoryUTG

Select #TableInspectionsUTGs.InspectionUTGID from #TableInspectionsUTGs

While ((Select Count(#TableInspectionsUTGs.InspectionUTGID) from #TableInspectionsUTGs) > 0)
Begin
  select top 1 UserTmin ,RLTMin
  from InspectionHistoryUTGTML 
  where InspectionUTGID = #TableInspectionsUTGs.InspectionUTGID and RLTMin is not null order by RLTMin 
End

Ноэто не работает.Я просто хочу использовать каждый InspectionUTGID, возвращенный в первом запросе против InspectionUTGID в предложении where второго запроса, а затем использовать UserTmin, возвращенный во втором запросе, против TMin в 3 запросе.

1 Ответ

0 голосов
/ 27 апреля 2019

Если я понимаю, что вы пытаетесь выполнить, т. Е. Обновить Tmin в InspectionHistoryUTG на основании самого последнего значения UserTmin в InspectionHistoryUTGTML, тогда вы будете действовать процедурным образом, как если бы вы былинаписание обычного кода.Однако при написании SQL нужно использовать кодирование, основанное на множестве, потому что именно так SQL Server работает и работает.

Таким образом, то, чего вы пытаетесь достичь, может быть достигнуто с помощью одного оператора обновления SQL следующим образом:

declare @InspectionHistoryUTG table (InspectionUTGID int, TMin int);
declare @InspectionHistoryUTGTML table (InspectionUTGID int, UserTmin int, RLTMin int);

insert into @InspectionHistoryUTG (InspectionUTGID)
  select 1
  union all select 2
  union all select 3;

insert into @InspectionHistoryUTGTML (InspectionUTGID, RLTMin, UserTmin)
  select 1, 1, 1
  union all select 1, 2, 2
  union all select 1, 3, 3
  union all select 2, 1, 3
  union all select 2, 2, 2
  union all select 2, 3, 1
  union all select 3, 1, 2
  union all select 3, 2, 3
  union all select 3, 3, 1;

--select * from @InspectionHistoryUTG;
--select * from @InspectionHistoryUTGTML;

update IH set
  TMin = (
      select top 1 IHT.UserTmin
      from @InspectionHistoryUTGTML IHT
      where IHT.InspectionUTGID = IH.InspectionUTGID and IHT.RLTMin is not null
      order by IHT.RLTMin
    )
from @InspectionHistoryUTG IH
-- Following where clause won't update if a single null TML record exists as per OPs comment
where not exists (
  select 1
  from @InspectionHistoryUTGTML IHT
  where IHT.InspectionUTGID = IH.InspectionUTGID and IHT.RLTMin is null
)

select * from @InspectionHistoryUTG;
--select * from @InspectionHistoryUTGTML;

Мы просто используем регулярный оператор обновления для InspectionHistoryUTG с подзапросом для InspectionHistoryUTGTML, чтобы получить требуемое значение для TMin для текущего значения InspectionUTGID.

Поэтому вместо того, чтобы обновлять InspectionHistoryUTG по одной строке за раз, используя несколько операций выбора и обновления, мы выполняем всю работу за один клик.

Примечание. Это также означает, что вы должны представлять свои вопросы в будущем, поскольку это означает, чтолюди, желающие помочь, могут просто скопировать и вставить SQL в свой анализатор запросов и начать работать с ним, используя действительные образцы данных.

...