Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ansible/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否在SQL Server中选择项类型及其基类型?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

是否在SQL Server中选择项类型及其基类型?

是否在SQL Server中选择项类型及其基类型?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一张简单的桌子: 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

我有一张简单的桌子:

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的所有项目,但如果有一行,也要提供其基本itemtype(如果存在),即itemtype=0

例如:

对于itemType=3

应提供1000,0-为什么?因为表还有1000+项类型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,所以只有itemType本身

我开始做:

;with cte as(
             SELECT * FROM @t  
            )
select * from cte where itemType=3
总之,如果找到itemType,则提供其自身+其零类型(如果存在),并为其兄弟样本1提供零类型

但我不能在这里做工会因为CTE在那里不被认可。。。垃圾这是可能的

我怎样才能解决它

为了避免对itemType=3查询求值两次,您可以自外部联接,然后使用交叉应用。。。要取消Pivot的值

执行计划

为了避免对itemType=3查询求值两次,您可以自外部联接,然后使用交叉应用。。。要取消Pivot的值

执行计划



@JW。我还添加了大胆的总结。如果是helps@JW. 非常感谢@JW@JW。我还添加了大胆的总结。如果是helps@JW. 非常感谢@JW@RoyiNamir我没有使用交叉应用,你看到fiddle上的链接了吗DWTF?为什么我认为我毕竟不能访问CTE?我百分之百确定我在第一次使用后无法访问它…而且…在几天前我粘贴了这张照片之前…这就是为什么我记得我cant@JW. 第一个是批处理成本的15%,第二个是85%,因此SQL Server估计第二个是成本的5到6倍。不过,这些单位仅基于估算值和各种SQL Server成本假设,因此不应过于字面化。但我希望外部连接。。unpivot比select union join更好,因为它对recordList求值两次。@JW。不要删除。这是另一种方式。其他人可能会从中学习:-@RoyiNamir我没有使用交叉应用,你看到fiddle上的链接了吗DWTF?为什么我认为我毕竟不能访问CTE?我百分之百确定我在第一次使用后无法访问它…而且…在几天前我粘贴了这张照片之前…这就是为什么我记得我cant@JW. 第一个是批处理成本的15%,第二个是85%,因此SQL Server估计第二个是成本的5到6倍。不过,这些单位仅基于估算值和各种SQL Server成本假设,因此不应过于字面化。但我希望外部连接。。unpivot比select union join更好,因为它对recordList求值两次。@JW。不要删除。这是另一种方式。其他人可能会从中学习:-当T1.itemType=0时是否可以消除重复项?非常好。我知道交叉应用是一个行乘数,但从来没有听说过这种值语法……当T1.itemType=0时,有可能消除重复项吗?太棒了。我知道交叉应用为行乘数,但从未听说过这种值语法。。。。。。
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
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
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;