2013-03-29 4 views
0

어떻게 이런 쿼리에서 사용할 수 있습니까? TableList에서 tableIds를 사용하는 방법이 있습니까? 하위 쿼리처럼 취급 할 수 있습니까?where 절에 sql을 사용하십시오

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

메신저가 재귀 적으로 표를 가져 오려고합니다. 내 OldTable 열에는 TableId, ParentTableId 및 Isdeleted가 있습니다. 이 sql 메신저를 사용하여 tableId = 5의 모든 자식 테이블을 가져 오려고 시도합니다. –

답변

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 * 
FROM TestTable 
WHERE tableId in 
(
    SELECT tableId FROM TableList 
) 

편집을 - 당신은 귀하의 의견을 바탕으로 VIEW에서 재귀 적 CTE를 정의한 다음 필요에 따라 사용할 수 있습니다.

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 키워드는 이제까지 공통 테이블 표현식에 일치하는 항목이 여러 개있다 TestTable의 레코드가있는 경우 독특한 될 결과에 대한 순서로 SELECT 절에 적용된다.

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

당신은 SQL 호출하기 전에 CTE WITH를 정의 할 필요가
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

나는 무엇을하려고하는지 질문하기 위해 편집했다. –