SQL — С инструкцией в WHERE claue

#sql #where-clause #with-statement

#sql #where-предложение #с помощью-инструкции

Вопрос:

привет,

Может ли состояние WITH существовать в предложении WHERE?

например:

 SELECT tbl1.name , tbl1.ID  
FROM DBTABLE0001 AS tbl1
WHERE  ( 
    exists(

        WITH H (super, ID, depth) AS 
        ( 
        SELECT ROOT.parent, ROOT.ID , 0 
        FROM DBTABLE0001 ROOT  
        WHERE ROOT.ID = tbl1.ID 

        UNION ALL 

        SELECT PARENT.parent, PARENT.ID , CHILD.depth   1 
        FROM H CHILD, DBTABLE0001 PARENT 
        WHERE PARENT.ID = CHILD.super 

        )

        SELECT ID 
        FROM H 
        WEHER H.ID = "abcd"
        ORDER BY depth

    ) 
)  
  

Спасибо,
Мо.

Комментарии:

1. Добро пожаловать в StackOverflow. В следующий раз, пожалуйста, используйте кнопку {} для форматирования вашего кода.

2. Вы пробовали это? ( вам следует изменить WEHER на WHERE хотя )

3. Вы имели в виду конкретную СУБД?

4. Вы используете H рекурсивно. Я не уверен, что это разрешено. Вы пробовали это в какой-либо RDBMS?

5. 10x ребята, H должен быть рекурсивным, и это разрешено. пожалуйста, посмотрите мой ответ Фрейзину, чтобы понять мою цель.

Ответ №1:

Вы должны поместить свои операторы with в начале вашего запроса. затем вы можете использовать его везде, где :

 WITH H (super, ID, depth) AS           
            (SELECT ROOT.parent, ROOT.ID , 0 
                  FROM DBTABLE0001 ROOT            
              WHERE ROOT.ID = DBTABLE0001.ID             
              UNION ALL             
              SELECT PARENT.parent, PARENT.ID , CHILD.depth   1                         FROM H CHILD, DBTABLE0001 PARENT           
                WHERE PARENT.ID = CHILD.super) 

SELECT tbl1.name , tbl1.ID    
    FROM DBTABLE0001 AS tbl1  
    WHERE  (exists(SELECT ID FROM H WEHER H.ID = "abcd"  ORDER BY depth)) 
  

Комментарии:

1. Проблема в том, что в WITH задействован основной select ИЗ таблицы: WHERE ROOT. ID = tbl1. ИДЕНТИФИКАТОР параметра tbl1 является внешней таблицей выбора.

2. Но тогда он не будет выполняться в правильном контексте — это также то, что db2 кричит: SQL0206N «DBTABLE0001.ID «недопустимо в контексте, где оно используется

3. является ли DBTABLE0001 именем таблицы или нет?

4. Большое спасибо за вашу помощь, Фрейзин. DBTABLE0001 — это имя таблицы, но ROOT — это псевдоним для той же таблицы. H run выполняется рекурсивно для каждой записи и приносит мне некоторые результаты (таблица представляет некоторое содержимое иерархии), и моя цель — получить все записи из DBTABLE0001, чтобы его рекурсивное выполнение возвращало некоторые результаты.

5. При использовании инструкции With вам следует добавить свою инструкцию with в начале вашего запроса. другое решение, которое вы, возможно, захотите попробовать, — использовать Cursor для создания такой рекурсии.