0

我有这个查询:

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

4 回答 4

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)
于 2012-09-21T12:41:26.053 回答
0

为什么不:

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

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

于 2012-09-21T12:41:33.127 回答
0

只需简化:

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

没有行的情况在这里也没有任何作用。你不需要为此做一个特殊的测试。

于 2012-09-21T12:41:56.113 回答
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 为空,这会导致在 t1.value1 中插入“t2.value2”

于 2012-09-21T12:43:56.400 回答