2010-07-28 120 views
-1

我有一個像下面的sql語句。如何在不使用union關鍵字的情況下將單個行(代碼= 0,desc = 1)添加到此sql語句的結果中?謝謝。如何在不使用union的情況下編寫Sql語句?

select code, desc 
from material 
where material.ExpireDate ='2010/07/23' 
+3

?面試嗎? – pascal 2010-07-28 08:11:50

+0

UNION有時候被DB提供者嚴重對待,例如Delphi中的TClientDataSet + TDataSetProvider – too 2010-07-28 08:16:42

+2

存儲過程如何返回結果集?或者在調用者代碼中添加這個僞行?順便說一句,使用'DESC'作爲列名,你沒有問題,因爲它已經是SQL關鍵字了嗎? – pascal 2010-07-28 08:22:29

回答

3

您可以隨時爲您的表,它本身使用UNION關鍵字

CREATE VIEW material_view AS SELECT code, desc, ExpireDate FROM material UNION SELECT '0', '1', NULL; 
SELECT code, desc FROM material_view WHERE ExpireDate = '2010/07/23' OR code = '0'; 
+0

我不想使用意見。 – mkus 2010-07-28 08:16:37

+6

不需要'-1'的答案...你沒有提到在你的問題避免查看。 – pascal 2010-07-28 08:19:29

+1

因此,添加一個新行的空日期(和其他字段)和代碼爲'0'的材料,並使用: SELECT code,desc FROM material WHERE ExpireDate ='2010/07/23'OR code ='0'; – too 2010-07-28 08:19:34

0

既然你不想使用一個工會或圖的圖,我建議增加一個虛擬行到材料表(與碼= 0,DESC = 1,和EXPIREDATE一些會從不通常被選擇 - 例如01 1900年1月) - 然後使用查詢類似如下:

select code, desc 
from material 
where material.ExpireDate ='2010/07/23' or 
    material.ExpireDate ='1900/01/01' 

通常,一個聯盟將是米y首選選項。

1
WITH material AS 
(
SELECT * 
FROM 
     (VALUES (2, 'x', '2010/07/23'), 
       (3, 'y', '2009/01/01'), 
       (4, 'z', '2010/07/23')) vals (code, [desc], ExpireDate) 
) 

SELECT 
    COALESCE(m.code,x.code) AS code, 
    COALESCE(m.[desc],x.[desc]) AS [desc] 
FROM material m 
FULL OUTER JOIN (SELECT 0 AS code, '1' AS [desc]) x ON 1=0 
WHERE m.code IS NULL OR m.ExpireDate ='2010/07/23' 

爲什麼不使用`UNION`給人

code  desc 
----------- ---- 
2   x 
4   z 
0   1 
+0

你可以用行構造函數替換'UNION ALL',例如'(VALUES(2,'x','2010/07/23'),(3,'y','2010/07/23'),(4,'z','2010/07/23 '))AS材料(代碼,[desc],ExpireDate)...' – onedaywhen 2010-07-28 16:28:37

+0

@onedaywhen - 是的,我已經做到了。好建議謝謝! – 2010-07-28 16:48:01

相關問題