Запрос двойной с предложением - PullRequest
0 голосов
/ 05 марта 2019

Я хотел бы использовать с оператором дважды.

WITH userChild AS
(
    WITH deptChild AS
    (
    SELECT dept_no, parent_dept_no, name
    FROM [dbo].[tb_dept] D WITH(NOLOCK)
     WHERE parent_dept_no = 2
     AND D.company_no = 1

      UNION ALL
      SELECT D.dept_no, D.parent_dept_no, D.name
      FROM [dbo].[tb_dept] D  WITH(NOLOCK)
   INNER JOIN deptChild  
   ON D.parent_dept_no = deptChild.dept_no
   WHERE D.company_no = 1
   )
   SELECT user_no
   FROM [dbo].[tb_dept_user] WITH(ROWLOCK)
   WHERE dept_no IN (SELECT dept_no FROM deptChild)
)
SELECT *
FROM [dbo].[tb_user] U WITH(NOLOCK)
WHERE user_no IN (SELECT user_no FROM userChild)

Это мой код для этого. Внутренний оператор WITH выбирает user_no из всех depts, найденных в deptChild. Таблица tb_user не имеет столбца dept_no. Итак, со всеми user_no, найденными из deptChild, я бы хотел выбрать все столбцы этой user_no из tb_user таблиц. Как мне это сделать?

1 Ответ

4 голосов
/ 05 марта 2019

Нет необходимости делать это. Просто соедините CTE:

WITH deptChild AS (
      SELECT dept_no, parent_dept_no, name
      FROM [dbo].[tb_dept] D
      WHERE parent_dept_no = 2 AND D.company_no = 1
      UNION ALL
      SELECT D.dept_no, D.parent_dept_no, D.name
      FROM [dbo].[tb_dept] D INNER JOIN
           deptChild  
           ON D.parent_dept_no = deptChild.dept_no
      WHERE D.company_no = 1
    ),
    userChild as (
     SELECT user_no
     FROM [dbo].[tb_dept_user] 
     WHERE dept_no IN (SELECT dept_no FROM deptChild)
    )
SELECT *
FROM [dbo].[tb_user] U
WHERE user_no IN (SELECT user_no FROM userChild);

Также обратите внимание, что я удалил WITH (NOLOCK). Вам не следует использовать такие подсказки, если вы не очень хорошо знаете, что делаете.

...