是否在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;