2012-09-21 86 views
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查詢中受益。

+0

您的查詢似乎沒有意義( 'select * from T2'?)。你能用文字來解釋嗎,一個假的但可以理解的結構,你想達到什麼目的? –

回答

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) 
0

爲什麼不:

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

如果在T2中沒有行,則不會在#t1中插入任何內容。

0

只是簡化:

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

那裏有沒有行並不在這裏無論是做任何事情的情況。你不需要爲此做一個特殊的測試。

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是空