1

私は単純なテーブルを持っています:

DECLARE @t TABLE(item INT, itemType INT  )

insert INTO @t SELECT 1000,0
insert INTO @t SELECT 1000,3
insert INTO @t SELECT 1000,5
insert INTO @t SELECT 1000,6
insert INTO @t SELECT 2000,0
insert INTO @t SELECT 2000,3
insert INTO @t SELECT 2000,5
insert INTO @t SELECT 2000,6
insert INTO @t SELECT 3000,0
insert INTO @t SELECT 3000,10
insert INTO @t SELECT 4000,11

すべてのアイテムを選択したいのですが、行がある場合は、itemtype = 3そのベース(存在する場合)も提供します。itemtypeitemType = 0

例えば ​​:

  • itemType = 3 の場合

    1000,0提供する必要があります --なぜですか? table にも 1000 + itemType 0
    1000,3を指定する必要があるため --なぜ ? itemType=3
    2000,0を指定する必要があることを確認したためです --なぜ ? テーブルが 2000,3 を検出し、この 2000 にも itemType=0
    2000,3があるため、提供する必要があるのはなぜですか? itemType=3 を探したため

  • itemType = 10 の場合

    3000,0提供する必要があります --なぜですか? テーブルが 3000,10 を検出し、この 3000 にも itemType=0
    3000,10があるため、提供する必要があります --なぜですか? itemType=10 を探したため

  • itemType = 11 の場合

    4000,11提供する必要があります --なぜですか? itemType=11 を探したためです (注意、 itemType 0 がないため、それ自体のみ)。

私はやり始めました:

;with cte as(
             SELECT * FROM @t  
            )
select * from cte where itemType=3

要約すると、itemTypeが見つかった場合は、それ自体 + そのゼロ型 (存在する場合) を提供し、兄弟 ( sample(#1) ) にも提供します。

union しかし、CTEがそこで認識されないため、ここではできません...ごみ。可能です。

どうすれば解決できますか?

SQL オンライン

4

3 に答える 3

3

クエリを 2 回評価しないようにするにitemType = 3は、自己外部結合を使用CROSS APPLY ... VALUESしてから、UNPIVOT

DECLARE @itemType INT = 3;

WITH T(item1, itemType1, item2, itemType2 )
     AS (SELECT *
         FROM   @t T1
                LEFT JOIN @t T2
                  ON T1.item = T2.item
                     AND T2.itemType = 0
                     AND T1.itemType <> 0
         WHERE  T1.itemType = @itemType) 
SELECT item,
       itemType
FROM   T
       CROSS APPLY ( VALUES (item1, itemType1),
                            (item2, itemType2) ) v(item, itemType) 
WHERE item IS NOT NULL

SQL フィドル

実行計画

予定

于 2013-01-27T15:08:13.363 に答える
1
WITH recordList
AS
(
  SELECT item, itemType
  FROM   SampleTable
  WHERE  itemType = 11 -- change here
)
SELECT item, itemType FROM recordList
UNION
SELECT a.item, a.itemType
FROM   SampleTable a
       INNER JOIN recordList b
          ON a.item = b.item
WHERE  a.itemtype = 0
于 2013-01-27T15:09:17.600 に答える
1
DECLARE @findtype INT = 3;

WITH results AS
(
  SELECT t.item, @findtype
  FROM   @t t
  WHERE  t.itemType = @findtype
  UNION ALL
  SELECT t.item, 0
  FROM   @t t
         INNER JOIN results r on r.item = t.item
  WHERE  t.itemType = 0
)
SELECT * 
FROM results;
于 2013-01-27T15:11:10.363 に答える