Как выбрать из части таблицы, выбранной ранее - PullRequest
0 голосов
/ 08 апреля 2019

Из-за того, что я собираю данные со связанного сервера insql, я должен выбрать часть таблицы и работать над ней. Но когда я хочу сделать условный выбор из вложенной таблицы, я получаю «Недопустимая ошибка имени объекта», чего не должно быть, потому что я устанавливаю его с «AS»

    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))

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Вы ссылаетесь на t - который создается как псевдоним из подзапроса, в двух последующих подзапросах как таблицы в предложении FROM - это недопустимо, он думает, t есть реальное имя таблицы.Чтобы использовать его таким образом, вам нужно создать общее табличное выражение (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
                            )
    )
0 голосов
/ 08 апреля 2019

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

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
0 голосов
/ 08 апреля 2019

T - это не таблица, а псевдоним для подзапроса.Таким образом, в условии «где» вам нужно указать имя таблицы, в которой вы получаете максимальную дату.

   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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...