#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 для создания такой рекурсии.