2012-07-17 54 views
0

我有一种情况,我必须合并两个表而不丢失任何数据。这两张桌子有不同的结构。以下是我的表sql server合并两个不同结构的表

TABLE A 
ID_NO INT, 
Ship_Date DATE, 
Status varchar(10), 
total decimal(12,2) 

TABLE B 
ID_NO INT, 
Status varchar(10), 
total decimal(12,2) 

我试着使用UNION的结构全部由包括表B中的虚拟列如下

TABLE B 
ID_NO INT, 
'', 
Status varchar(10), 
total decimal(12,2) 

,但在结果集中,我得到为1900-01-01 Ship_Date代替 ''。如何消除这一点?

回答

5

使用NULL值,而不是一个空字符串。如果您不介意Ship_Date结果为字符串,则可以将UNION包装在另一个select语句中。

SELECT U._ID_NO, 
     CASE WHEN U.Ship_Date IS NULL 
       THEN '' 
       ELSE CONVERT(NVARCHAR(50), U.Ship_Date,101) END AS Ship_Date, 
     U.Status, 
     U.total 
FROM 
(
    SELECT A.ID_NO, A.Ship_Date, A.Status, A.total 
    FROM TableA 

    UNION ALL 

    SELECT B.ID_NO, NULL AS Ship_Date, B.Status, B.total 
    FROM TableB 
) AS U 
+0

谢谢Holger。有没有办法包含一个空字符串而不是null? – rock 2012-07-17 15:54:41

+1

该列需要“DATETIME”值或“NULL”。 – RobB 2012-07-17 15:55:26

+0

@ranjith我改变了答案给你一个字符串日期或空字符串如果为NULL。 – 2012-07-17 16:08:35

2

Ship_Datedate数据类型,为什么不使用NULL作为虚拟占位符?

TABLE B 
ID_NO INT, 
NULL, 
Status varchar(10), 
total decimal(12,2) 
2

您得到1900-01-01,因为该列类型为DATETIME。如果您希望它是“空的”,请使用NULL而不是''

尝试:

select 
    ID_NO, 
    case 
     when Ship_Date is NULL then '' 
     else Ship_Date 
    end as Ship_Date, 
    Status, 
    total 
from 
(
    select 
     ID_NO, 
     Ship_Date, 
     Status, 
     total 
    from 
     table_a 

    union all 

    select 
     ID_NO, 
     NULL as Ship_Date, 
     Status, 
     total 
    from 
     table_b 
) combined 
+0

更新回答符合OP的显示空字符串的请求。 – RobB 2012-07-17 16:01:11