0

このようなクエリで with を使用するにはどうすればよいですか? TableList で tableIds を使用する方法はありますか? それらをサブクエリのように扱うことはできますか?

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
)

編集: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クエリの途中で with 句を使用しようとする理由を示していると思います。

4

2 に答える 2

1

でこれを行うのJOINが好きなので、このようになります。WITHstatement は常に SQL クエリ ステートメントの最初のステートメントです。

共通テーブル式に複数の一致があるレコードがある場合に結果が一意になるように、句にDISTINCTキーワードが適用されます。SELECTTestTable

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

更新 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)
于 2013-03-29T14:10:13.570 に答える
1

SQL を呼び出す前に、WITH CTE を定義する必要があります。

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
)

編集 -- コメントに基づいて、再帰 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;
于 2013-03-29T14:10:49.333 に答える