2015-10-07 134 views
0

我工作的公司使用稱爲Showcase的程序在我們的財務部門構建報表,Showcase根據插入到接口中的條件構建SQL查詢並返回數據然後在Excel中使用它進一步格式化和分析。我們有一個特定的報告不斷突破,所以我試圖重寫SQL Server中的查詢。將DB2 SQL查詢與按位AND轉換爲SQL Server查詢

FROM子句中有一部分執行按位AND。我以前從來沒有在SQL Query中使用過這個,這是查詢有問題的地方。我甚至不知道它是如何實現按位與 - 它是比較兩個值的更準確的方法嗎?

下面是FROM子句,因爲它是未來直展櫃:

FROM 
S06947A4.GLDBFA.GLPCT T01 
INNER JOIN S06947A4.GLDBFA.GLPDA GLPDA ON T01.CTCO=GLPDA.DACO 
LEFT OUTER JOIN S06947A4.GLDBFA.GLPBX T02 ON T01.CTCO=T02.BXCO AND T01.CTPAGE=T02.BXPAGE AND GLPDA.DAYEAR=T02.BXYEAR AND &GLMORS=T02.BXMORS 
LEFT OUTER JOIN S06947A4.GLDBFA.GLPGL T03 ON T01.CTCO=T03.GLCO AND T01.CTPAGE=T03.GLPAGE AND GLPDA.DAYEAR=T03.GLYEAR AND &GLMORS=T03.GLMORS 

這個問題似乎是與兩個LEFT OUTER的最後部分連接:

&GLMORS=T02.BXMORS 
&GLMORS=T03.GLMORS 

我已經沒有問題重建查詢到這一點,如果我從這些JOINS中的每一個省略這兩個部分我得到一些數據回來但是我可以告訴它是錯誤的,因爲我得到更多的行比我的預期。

任何指針或筆記將不勝感激。 非常感謝。


我已經編輯到FROM子句更具體與參數:

FROM 
    GLDBFA.GLPCT PCT 
    INNER JOIN GLDBFA.GLPDA PDA ON PCT.CTCO=PDA.DACO 
    LEFT OUTER JOIN GLDBFA.GLPBX PBX ON CTCO=PBX.BXCO AND CTPAGE=PBX.BXPAGE AND PDA.DAYEAR=PBX.BXYEAR AND PGL.GLMORS=PBX.BXMORS 
    LEFT OUTER JOIN GLDBFA.GLPGL PGL ON CTCO=PGL.GLCO AND CTPAGE=PGL.GLPAGE AND PDA.DAYEAR=PGL.GLYEAR AND PGL.GLMORS=PBX.BXMORS 

下劃線的錯誤是在第一左外連接:

AND PGL.GLMORS=PBX.BXMORS 

它不喜歡聲明中的'PGL.GLMORS'部分,但在第二次左外部連接中它沒問題,這對我來說沒有任何意義。 希望這有助於。


我發現我的方式錯誤。 '& GLMORS的值實際上是傳遞給Showcase的變量,所以我必須在這些變量值中編寫代碼以滿足FROM。

再次感謝所有您的意見和協助。

+0

所以這是被髮送到一個SQL Server數據庫的SQL是什麼呢?或者是自己展示數據庫? – Rikalous

+0

因此,展示是一個連接到我們的金融系統的程序,但人們爲其構建的查詢似乎經常中斷。我已經開始構建用於報告的Datawarehouse,並且最近我爲我們的金融系統設置了一個ODBC連接來將這些數據提取出來,以便我可以在SQL Server中重新編寫這些查詢。由於這些查詢是系統生成的,因此他們似乎使用了我不熟悉的一些方法 - 例如FROM子句中的按位AND。這是否更有意義? – JasonR

+0

好的 - 那麼財務系統就不是sqlsvr了。 – Rikalous

回答

0

表結構和/或錯誤消息將大大幫助。

乍一看,&GLMORS=T03.GLMORS讓我覺得你有衝突的GLMORS列,並且你需要類似&T01.GLMORS=T03.GLMORS之類的東西。

否則,按位運算符(&)是一個二元運算符,它需要2個值並輸出結果。所以你得到一些謊言5&12=4。在這種情況下,你有一個「一元」&,我沒有線索它應該做什麼,但它看起來不像是一個按位與。

+0

感謝您花時間看這個。我得到的錯誤是:消息4104,級別16,狀態1,行129 多部分標識符「PGL.GLMORS」無法綁定。但是對於我來說這是沒有意義的,因爲我已經更新了編輯的子句(見上)。 – JasonR

0

你引用的相關名PGL介紹之前,看到的代碼片段評論:

INNER JOIN GLDBFA.GLPDA PDA ON PCT.CTCO=PDA.DACO 
LEFT OUTER JOIN GLDBFA.GLPBX PBX 
    ON CTCO=PBX.BXCO 
    AND CTPAGE=PBX.BXPAGE 
    AND PDA.DAYEAR=PBX.BXYEAR 
    AND PGL.GLMORS=PBX.BXMORS -- <<< "PGL" is unknown at this point 
          -- it is only introduced on the next line 
          -- and this condition is redundant anyway 
          -- so it can be safely removed 
LEFT OUTER JOIN GLDBFA.GLPGL PGL 
    ON CTCO=PGL.GLCO 
    AND CTPAGE=PGL.GLPAGE 
    AND PDA.DAYEAR=PGL.GLYEAR 
    AND PGL.GLMORS=PBX.BXMORS