2013-03-29 11 views
0

Как я могу использовать это в запросе? Есть ли способ использовать tableIds в TableList? Могу ли я рассматривать их как подзапрос?Использование sql with in where where

select * from TestTable where tableId in 

(WITH TableList (tableId) 
AS 
(
SELECT tableId FROM OldTable WHERE tableId=5 and IsDeleted = 0 
UNION ALL 
SELECT t.tableId From OldTable as t 
INNER JOIN TableList as p 
ON t.ParenTableId = p.TableId 
WHERE t.IsDeleted = 0 
) 
SELECT tableId FROM TableList 
) 

EDIT: показать, почему я не могу использовать это в первом выражении sql.


select TableId, IsDeleted, 
( 
    select count(OtherId) OtherTable 
    where otherTableId in 
    (WITH TableList (tableId) 
    AS 
    (
    SELECT tableId FROM OldTable WHERE tableId=5 and IsDeleted = 0 
    UNION ALL 
    SELECT t.tableId From OldTable as t 
    INNER JOIN TableList as p 
    ON t.ParenTableId = p.TableId 
    WHERE t.IsDeleted = 0 
) 
    SELECT tableId FROM TableList 
) 
) as Ex1 
from TestTable where tableId in (1,2,3) 

Я думаю, что это шоу, почему им пытаются использовать с пунктом в середине запроса SQL.

+0

Что вы пытаетесь сделать здесь? –

+0

im пытается получить столы рекурсивными. В моих столбцах OldTable используются TableId, ParentTableId и Isdeleted. Используя этот sql im, пытаясь получить все дочерние таблицы tableId = 5 –

ответ

1

Вы должны определить ваш с КТР перед вызовом SQL:

WITH TableList (tableId) 
AS 
(
    SELECT tableId FROM OldTable WHERE tableId=5 and IsDeleted = 0 
    UNION ALL 
    SELECT t.tableId From OldTable as t 
     INNER JOIN TableList as p 
      ON t.ParenTableId = p.TableId 
    WHERE t.IsDeleted = 0 
) 
SELECT * 
FROM TestTable 
WHERE tableId in 
(
    SELECT tableId FROM TableList 
) 

EDIT - на основе ваших комментариев, вы может определить ваш рекурсивный CTE в VIEW, а затем использовать по мере необходимости:

CREATE VIEW YourView AS 
WITH TableList (tableId) 
AS 
(
    SELECT tableId FROM OldTable WHERE tableId=5 and IsDeleted = 0 
    UNION ALL 
    SELECT t.tableId From OldTable as t 
     INNER JOIN TableList as p 
      ON t.ParenTableId = p.TableId 
    WHERE t.IsDeleted = 0 
) 
SELECT * 
FROM TableList; 
+0

выглядит как тупик для меня. Есть ли у вас предложение для рекурсивного sql, кроме как с? –

+0

@ EmreErişgen: не в SQLServer. –

+0

@ EmreErişgen - вы можете определить свой рекурсивный CTE как вид, а затем использовать соответствующим образом. – sgeddes

1

Я предпочитаю делать это в JOIN, поэтому он выглядит так. Оператор WITH всегда является первым в запросе запроса sql.

DISTINCT ключевое слово применяется на пункте SELECT для того, чтобы результат был уникальным, если когда-либо есть записи из TestTable, который имеет несколько матчей на общем табличном выражении.

WITH TableList (tableId) 
AS 
(
    SELECT tableId FROM OldTable WHERE tableId=5 and IsDeleted = 0 
    UNION ALL 
    SELECT t.tableId From OldTable as t 
    INNER JOIN TableList as p 
    ON t.ParenTableId = p.TableId 
    WHERE t.IsDeleted = 0 
) 
SELECT DISTINCT a.* 
FROM TestTable a 
     INNER JOIN TableList b 
      ON a.tableId = b.tableId 

UPDATE 1

WITH TableList (tableId) 
AS 
(
    SELECT tableId FROM OldTable WHERE tableId=5 and IsDeleted = 0 
    UNION ALL 
    SELECT t.tableId From OldTable as t 
    INNER JOIN TableList as p 
    ON t.ParenTableId = p.TableId 
    WHERE t.IsDeleted = 0 
) 
SELECT DISTINCT t.TableId, t.IsDeleted, f.totalCount 
FROM TestTable t 
     INNER JOIN 
     (
      SELECT a.otherTableId, COUNT(DISTINCT a.OtherId) totalCount 
      FROM OtherTable a 
        INNER JOIN TableList b 
         ON b.tableId = a.otherTableId 
      GROUP BY otherTableId 
     ) f ON t.tableId = f.otherTableId 
WHERE t.tableId in (1,2,3) 
+0

, я не могу использовать с заявлением сначала в sql-запросе. Мне нужно использовать его как подзапрос. –

+0

В чем причина, почему вы не можете его использовать? Вы не можете обернуть общее выражение таблицы в подзапрос. –

+0

Я редактировал вопрос, чтобы показать, что я пытаюсь сделать. –