案例 - 查询优化

时间:2012-09-21 12:36:20

标签: tsql

我有这个问题:

INSERT INTO #t1 (VALUE1, VALUE2)
SELECT 
CASE
WHEN EXISTS(SELECT * FROM T2)
THEN SELECT VALUE1, VALUE2 FROM T2
END

这不起作用,我得到:“INSERT语句的选择列表包含的项目少于插入列表.SELECT值的数量必须与INSERT列的数量相匹配。”

相反,我必须使用:

INSERT INTO #t1 (VALUE1, VALUE2)
SELECT 
CASE
WHEN EXISTS(SELECT * FROM T2)
THEN SELECT VALUE1 FROM T2
END

CASE
WHEN EXISTS(SELECT * FROM T2)
THEN SELECT VALUE2 FROM T2
END

但这会降低性能。有没有正确的解决方案?在单个CASE中,受益于第二个表t2的sinqle查询。

4 个答案:

答案 0 :(得分:1)

EXISTS(SELECT * FROM T2)没有做任何事情,语法错误

试试这个:

INSERT INTO #t1 (VALUE1, VALUE2)
SELECT VALUE1, VALUE2 FROM T2

这也是有效的,虽然不是很有用,但它似乎是你想要做的:

INSERT INTO #t1 (VALUE1, VALUE2)     
SELECT VALUE1, VALUE2 FROM T2
WHERE exists (SELECT 1 FROM T2)

答案 1 :(得分:0)

为什么不:

INSERT INTO #t1 (VALUE1, VALUE2)
SELECT VALUE1, VALUE2 FROM T2

如果T2中没有行,则不会在#t1中插入任何内容。

答案 2 :(得分:0)

简化:

INSERT INTO #t1 (VALUE1, VALUE2)
SELECT VALUE1, VALUE2
FROM T2

没有行的情况不会在此处执行任何操作。您无需为此进行特殊测试。

答案 3 :(得分:0)

你不能使用像

这样的东西
  INSERT INTO #t1 (VALUE1, VALUE2)
  SELECT value1, value2 from #t2 WHERE NOT (value1 IS NULL AND value2 IS NULL)

代替?

否则你的意图可能是

  INSERT INTO #t1 (VALUE1)
  SELECT CONCAT(value1, value2) from t2 Couldn't you use something like 

  INSERT INTO #t1 (VALUE1, VALUE2)
  SELECT value1, value2 from t2 WHERE NOT (value1 IS NULL AND value2 IS NULL)

代替?

否则你的意图可能是

  INSERT INTO #t1 (VALUE1)
  SELECT value1, value2 from #t2 WHERE NOT (value1 IS NULL AND value2 IS NULL)

如果t2.value2为null,则导致't2.value2'插入t1.value1