2013-05-07 84 views
1
SELECT b.*, 
     a.jeopCodeId, 
     a.JeopCodeDetail 
FROM storm_jeopinfo  a, 
     storm_orders  b 
WHERE a.ordernumber IS NOT NULL 
     AND a.ordernumber = b.order_number 
     AND b.Installed_dt IS NOT NULL 
     AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102) 
           AND CONVERT(date, '2013-04-30', 102) 
    UNION ALL 
SELECT b.*, 
     a.jeop_code, 
     a.jeop_desc 
FROM storm_bpm_jeops  a, 
     storm_orders  b 
WHERE b.order_number = a.Order_number 
     AND b.srvc_order_unit = a.srvc_order_unit 

錯誤消息:將所述VARCHAR值 'JEOP-008' 爲數據類型int時轉換失敗。誤差變換爲varchar到int

它繼續與下一列的系列。我無法成功執行此查詢。根據您的更新

+1

在第一個選擇中你選擇了'a.jeopCodeId'和第二個'a.jeop_code'。它們是相同的數據類型嗎? – jalynn2 2013-05-07 18:57:55

+0

使用隱式連接是一種非常糟糕的編程技巧。請閱讀http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/ref=sr_1_1?s=books&ie=UTF8&qid=1367959865&sr=1-1&keywords=sql+antipatterns找出這個問題和其他SQL反模式。 – HLGEM 2013-05-07 20:51:29

回答

1

你可能想

CAST(SUBSTRING(a.jeop_code,6,3)爲INT)作爲jeopCodeId

,或者您可能需要象下面這樣加入。

但是,除非您告訴我們您想要做什麼以及表格的業務規則,否則我無法確定。

SELECT b.*, 
       a.jeopCodeId, 
       a.JeopCodeDetail, 
     a2.jeop_code, 
     a2.jeop_desc 
FROM   storm_orders       b 
     join storm_jeepinfo a on a.ordernumber = b.order_number 
     join storm_bpm_jeops a2 on a2.order_number = b.order_number 
        and a2.srvc_order_unit = b.srvc_order_unit 
WHERE  a.ordernumber IS NOT NULL -- is b.ordernumber ever null if no then this can go. 
       AND b.Installed_dt IS NOT NULL 
       AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102)  
                              AND CONVERT(date, '2013-04-30', 102) 

問題:爲什麼storm_jeepinfo.ordernumber沒有_?如果你的命名一致,可能會更好。這是一個最明顯的新手錯誤。

錯誤的命名沒有任何好處!


看起來你有一些錯別字。請記住,在UNION中,所有選擇字段必須完全匹配...因此,例如在第一個選擇中,您選擇a.jeopCodeId,但在第二個字段中,您將忽略ID並選擇a.jeop_code - 它們顯然不兼容數據類型。

我注意到A在兩個select語句中都沒有引用同一個表。可能有些字段沒有兼容類型。在這種情況下,您可以選擇空字符串''0或者甚至null作爲您沒有嘗試合併的字段。

+0

*在這種情況下,你可以選擇空字符串''或0或甚至爲null你沒有你想要聯合的字段。*你總是可以投到varchar – 2013-05-07 19:03:19

+0

@ConradFrix - 當然,但我不'如果你沒有正確的數據,這樣做會有所幫助。僅僅投射東西並不會改變創建它們的業務規則。 – Hogan 2013-05-07 19:04:32

+0

好吧,當你用零,零值或空字符串來替換數據類型時,我認爲你已經失去了這個戰鬥。 – 2013-05-07 19:11:40

0
SELECT b.*, 
     cast (a.jeopCodeId as varchar (50)), 
     a.JeopCodeDetail 
FROM storm_jeopinfo  a 
JOIN  storm_orders  b 
    ON a.ordernumber = b.order_number 
WHERE a.ordernumber IS NOT NULL 
     AND b.Installed_dt IS NOT NULL 
     AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102) 
           AND CONVERT(date, '2013-04-30', 102) 
UNION ALL 
SELECT b.*, 
     a.jeop_code, 
     a.jeop_desc 
FROM storm_bpm_jeops  a 
JOIN  storm_orders  b 
    ON b.order_number = a.Order_number 
     AND b.srvc_order_unit = a.srvc_order_unit 

注意,我固定的隱含聯接不應使用,因爲它們具有較好的語法(更容易維護,並不太可能有意外的交叉連接)很多年前取代。此外,選擇*是一種非常差的技術,應該用字段列表替換。當你有一個聯盟時,這是尤其如此,因爲如果一個表發生變化,而另一個表發生變化,這將會中斷。此外,浪費網絡和數據庫資源來調用比您打算使用的列更多的列。