2013-05-02 54 views
2

我有一個表T1與一些日期/時間字段。我已經在這個表UNION查詢多種組合查詢,並在工會提出使用SELECT INTO新表T2如下:如何保留SELECT INTO後面的數據類型?

SELECT * INTO T2 
FROM (select * from query1_T1 
union 
select * from query2_T1) 

的問題是,query1_T1替換爲空字符串常量一些日期字段,其導致T2具有文本字段而不是日期/時間字段。舉例說明:

query1_T1: 
select myUDF(someTextField),"" as newDateField from T1 

query2_T1: 
select anotherUDF(someTextField),oldDateField from T1 

其中oldDateField是日期/時間。

有沒有一種方法可以構建SELECT INTO或更改query1_T1,以便我仍然可以從查詢中獲得相同的結果,但newDateField最終會以日期/時間結束?

+2

你有使用'選擇INTO'創建表?或者你可以單獨創建結構,然後再插入數據? – imthepitts 2013-05-02 16:54:07

+0

@imthepitts,工作得很好。我會接受它作爲答案。 – sigil 2013-05-02 17:06:40

回答

5

您始終可以獨立於將數據添加到表中來創建表。首先,用適當的數據類型定義所有的字段。然後使用INSERT INTO (columns) SELECT * FROM來填充它。

更新:

或者你也可以做一個混合的方法。在所有先做好SELECT INTO沒有行:

SELECT * INTO T2 
FROM query2_T1 
WHERE 1=0 

這將創建一個大部分的結構。然後,您可以去手動調整任何不正確的數據類型。

隨着適當調整結構,你可以放心地做到這一點:

INSERT INTO T2 
SELECT * FROM query1_T1 
UNION 
SELECT * FROM query2_T1 
+0

用於使用WHERE 1 = 0創建空表的+1。偷偷摸摸的! – 2013-05-02 20:25:31

+0

謝謝@GordThompson!我最近在我目前的項目中使用了相同的流程。所以它在我心中是新鮮的。 :o) – imthepitts 2013-05-02 20:27:03

+0

我意識到這是一箇舊的問題,但是,如果表中有某個點正在使用的每個字段的出現,那麼可以通過爲每個字段分組並選擇「MIN」值來進一步自動化該過程,例如:'SELECT MIN([people]。[forename]),MIN([people]。[surname]),MIN([people]。[dob])FROM query1_T1 WHERE 1 = 0'強制類型。 – Paul 2016-05-09 15:15:46

1

我還沒有在Access中試過這個,但是你幾乎可以在任何其他數據庫中使用cast()。 Access中的等效功能是cdate()。嘗試:

cdate(NULL) as newDateField 

如果你需要一個實際的值,則是這樣的:

cdate('1900-01-01') 
2

可以解決此問題,只需

  • 改變query1_T1返回Null而不是一個空串作爲第二列,並且

  • 倒車您UNION一起

即,

SELECT * INTO T2 
FROM 
(
select * from query2_T1 
UNION ALL 
select * from query1_T1 
) 

這樣一來,第二列包含一些日期值的查詢的順序時T2的表格結構由所確定的第一個UNIONed查詢,而第二個查詢不會強制將該列強制爲文本。