Поскольку я собираю данные со связанного сервера insql, я должен выбрать часть таблицы и работать с ней. Но когда я хочу сделать условный выбор из подтаблицы, я получаю сообщение «Недопустимая ошибка имени объекта», чего не должно быть, потому что я устанавливаю его с помощью «КАК»
SELECT * from (
SELECT * FROM [Runtime].[dbo].[History]
where TagName like '%L8.CipPhase%' and DateTime >= DATEADD(HOUR, -12, GETDATE())
) as t
WHERE t.[DateTime] >=
(SELECT MAX(t.[DateTime]) FROM t
where TagName like '%L8.CipPhase%' and t.[DateTime] <
(SELECT MAX(t.[DateTime]) from t
where TagName like '%L8.CipPhase%' and t.Value = 0))
Вы ссылаетесь на t, который создается как псевдоним из подзапроса, в двух дополнительных подзапросах как таблицы в предложении FROM - это не разрешено, он думает, что t
есть реальное имя таблицы. Чтобы использовать его таким образом, вам нужно будет создать Common Table Expression (CTE).
например
With t as (
SELECT * FROM [Runtime].[dbo].[History]
where TagName like '%L8.CipPhase%' and DateTime >= DATEADD(HOUR, -12, GETDATE())
)
SELECT * from t
WHERE t.[DateTime] >= (
SELECT MAX(t.[DateTime])
FROM t
where TagName like '%L8.CipPhase%'
and t.[DateTime] < (
SELECT MAX(t.[DateTime])
from t
where TagName like '%L8.CipPhase%'
and t.Value = 0
)
)
T — это не таблица, это псевдоним подзапроса. Итак, в условии where вам нужно указать имя таблицы, в которой вы получаете максимальную дату.
SELECT * from (
SELECT * FROM [Runtime].[dbo].[History]
where TagName like '%L8.CipPhase%' and DateTime >= DATEADD(HOUR, -12, GETDATE())
) as t
WHERE t.[DateTime] >=
(SELECT MAX(t.[DateTime]) FROM [Runtime].[dbo].[History] t
where TagName like '%L8.CipPhase%' and DateTime >= DATEADD(HOUR, -12, GETDATE() and t.[DateTime] <
(SELECT MAX(t.[DateTime]) from [Runtime].[dbo].[History] t
where TagName like '%L8.CipPhase%' and DateTime >= DATEADD(HOUR, -12, GETDATE() and t.Value = 0))
Если вы просто измените псевдоним t на исходную таблицу, предикат подзапроса DateTime >= DATEADD(HOUR, -12, GETDATE())
не будет включен в его дальнейшее использование. Намерение, по-видимому, заключается в повторном использовании, поэтому предикат также должен быть включен.
Отмечено, что использование CTE является эффективным способом, но это альтернатива, я также включил соответствующее условие where.
использовать временную таблицу:
SELECT * into #Temp FROM [Runtime].[dbo].[History]
where TagName like '%L8.CipPhase%' and DateTime >= DATEADD(HOUR, -12, GETDATE())
declare @DateTime DateTime
SELECT @DateTime=MAX(t.[DateTime])
FROM #Temp
where TagName like '%L8.CipPhase%' and t.[DateTime] <
(SELECT MAX(t.[DateTime]) from #Temp
where TagName like '%L8.CipPhase%' and t.Value = 0)
select * from #Temp
WHERE t.[DateTime] >= @DateTime
Я уверен, что есть более простой способ выразить этот запрос. Вам следует задать еще один вопрос с примерными данными, желаемыми результатами и объяснением того, чего вы пытаетесь достичь.