Как выбрать из части таблицы, выбранной ранее

Поскольку я собираю данные со связанного сервера 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))

Я уверен, что есть более простой способ выразить этот запрос. Вам следует задать еще один вопрос с примерными данными, желаемыми результатами и объяснением того, чего вы пытаетесь достичь.

Gordon Linoff 08.04.2019 12:40
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы ссылаетесь на 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()) не будет включен в его дальнейшее использование. Намерение, по-видимому, заключается в повторном использовании, поэтому предикат также должен быть включен.

Andrew 08.04.2019 10:51

Отмечено, что использование CTE является эффективным способом, но это альтернатива, я также включил соответствующее условие where.

Ajan Balakumaran 08.04.2019 10:56

использовать временную таблицу:

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

Другие вопросы по теме