2016-09-16 64 views
-1

我在oracle中有一個SQL查詢,我無法在sql服務器中重寫相同的內容。我無法使用左外連接並在組合中使用。有人能指出我正確的方向嗎?無法使用左外連接和在SQL Server中使用

這是我在Oracle查詢:

(select QD.FY_ST_QUESTION_DTL_TABLE_ID,qi.display_number,QI.QUESTION_NUMBER, 
           qd.question_part_number 
          from FY_ST_QUESTION_INFO qi, 
           FY_ST_QUESTION_DETAIL qd 
          where qi.region = cRegion 
          and qi.state_code = cState_Code 
          and qi.fy = nFY 
          and qi.report_id = nREPORT_ID 
          and qi.section_id = nSECTION_ID 
          and qi.subsection_id = nSUBSECTION_ID 
          and qi.display_number = nDISPLAY_NUMBER 
          and qi.QUESTION_NUMBER = nQUESTION_NUMBER 
          and (QI.REPORTER_ID = sUSER_ID or 
            QI.DELEGATE_ID = sUSER_ID or 
            QI.SUB_DELEGATE_ID = sUSER_ID) 
          and QD.FY_ST_QUESTION_INFO_TABLE_ID = QI.FY_ST_QUESTION_INFO_TABLE_ID 
         )fq left outer join 
         (select distinct FY_ST_QUESTION_DTL_TABLE_ID, AD.ROW_NUMBER 
          from UPLOAD_TEMP_DATA ad 
          where ad.region = cRegion 
          and ad.state_code = cState_Code 
          and ad.fy = nFY 
          and ad.report_id = nREPORT_ID 
          and ad.section_id = nSECTION_ID 
          and ad.subsection_id = nSUBSECTION_ID 
          and ad.display_number = nDISPLAY_NUMBER 
          and ad.QUESTION_NUMBER = nQUESTION_NUMBER 
          and ad.QUESTION_PART_NUMBER = nQUESTION_PART_NUMBER 
         )aq 
        using(FY_ST_QUESTION_DTL_TABLE_ID) 
       WHERE ROW_NUMBER IS NOT NULL 
      order by question_number,question_part_number,row_number ; 
+1

這個查詢好像我錯了;你確定它在Oracle中有效嗎? – Aleksej

+1

你應該養成使用ANSI-92風格連接的習慣。他們已經存在了近30年了。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+0

IIRC,使用的東西是一種自動連接兩個主鍵上的表?你不能在SQL服務器中做到這一點。您必須明確指定連接謂詞。 –

回答

0

不能使用USING在SQL Server連接(一些數據庫,如MySQL和Oracle例如你實現它,但是......沒有SQL服務器)

通過

ON QD.FY_ST_QUESTION_DTL_TABLE_ID = aq.FY_ST_QUESTION_DTL_TABLE_ID 

示例代碼替換它看起來並不要的方式工作的查詢中,)fq似乎很奇怪。 查詢的第一部分不需要(也不能)別名。

最後,主查詢的where子句應放在所有連接之後。

嘗試將其改寫爲

select 
     QD.FY_ST_QUESTION_DTL_TABLE_ID,qi.display_number,QI.QUESTION_NUMBER, 
     qd.question_part_number 
    from FY_ST_QUESTION_INFO qi 
    join FY_ST_QUESTION_DETAIL qd on QD.FY_ST_QUESTION_INFO_TABLE_ID = QI.FY_ST_QUESTION_INFO_TABLE_ID 
    left outer join 
     (select 
      distinct FY_ST_QUESTION_DTL_TABLE_ID, 
      AD.ROW_NUMBER 
     from UPLOAD_TEMP_DATA ad 
     where 
      ad.region = cRegion 
      and ad.state_code = cState_Code 
      and ad.fy = nFY 
      and ad.report_id = nREPORT_ID 
      and ad.section_id = nSECTION_ID 
      and ad.subsection_id = nSUBSECTION_ID 
      and ad.display_number = nDISPLAY_NUMBER 
      and ad.QUESTION_NUMBER = nQUESTION_NUMBER 
      and ad.QUESTION_PART_NUMBER = nQUESTION_PART_NUMBER 
     )aq 
      ON QD.FY_ST_QUESTION_DTL_TABLE_ID = aq.FY_ST_QUESTION_DTL_TABLE_ID 

     WHERE ROW_NUMBER IS NOT NULL 
     and qi.region = cRegion 
     and qi.state_code = cState_Code 
     and qi.fy = nFY 
     and qi.report_id = nREPORT_ID 
     and qi.section_id = nSECTION_ID 
     and qi.subsection_id = nSUBSECTION_ID 
     and qi.display_number = nDISPLAY_NUMBER 
     and qi.QUESTION_NUMBER = nQUESTION_NUMBER 
     and (QI.REPORTER_ID = sUSER_ID or 
      QI.DELEGATE_ID = sUSER_ID or 
      QI.SUB_DELEGATE_ID = sUSER_ID) 
     order by question_number,question_part_number,row_number ; 

Actual code: 

CREATE PROCEDURE [HSIP].[PROJECTLIST_RPT1](

@cRegion CHAR(2) = '00', 
@cState_Code CHAR(2) = '00', 
@nFY NUMERIC(4,0) = 0, 
@nREPORT_ID NUMERIC(2,0) = 0, 
@nSECTION_ID NUMERIC(2,0) = 0, 
@nSUBSECTION_ID NUMERIC(2,0) = 0, 
@nQUESTION_NUMBER NUMERIC(38,0) = 0, 
@nDISPLAY_NUMBER NUMERIC(38,0) = 0, 
@nQUESTION_PART_NUMBER NUMERIC(38,0) = 0, 
@sUSER_ID VARCHAR(25) = NULL, 
@nFY_ST_QUESTION_DTL_TABLE_ID NUMERIC(38,0) = 0, 
[email protected]_num integer ) 
@nROW_NUMBER NUMERIC(38,0) = 0) 


--coloffset integer := 17; 

AS 
BEGIN 

SET NOCOUNT ON; 

--declare @setval as varchar 

declare @coloffset as integer = 17 

select @nrow_number, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),1) as ProjectName, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),2) as ImprovementCategory, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),3) as SubCategory, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),4) as ProjectOutputs, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),5) as OutputType, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),6) as HsipProjectCost, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),7) as TotalProjectCost, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),8) as FundingCategory, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),9) as FunctionalClassification, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),10) as FunctionalClassificationOther, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),11) as Asdt, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),12) as Speed, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),13) as Ownership, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),14) as OwnershipOther, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),15) as RelevantShspEmphasisArea, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),16) as RelevantShspEmphasisAreaOther, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0),17) as RelevantShspStrategy, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+1) as ErrProjectName, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+2) as ErrImprovementCategory, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+3) as ErrSubCategory, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+4) as ErrProjectOutputs, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+5) as ErrOutputType, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+6) as ErrHsipProjectCost, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+7) as ErrTotalProjectCost, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+8) as ErrFundingCategory, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+9) as ErrFunctionalClassification, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+10) as ErrFunctionalClassificationOth, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+11) as ErrAsdt, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+12) as ErrSpeed, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+13) as ErrOwnership, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+14) as ErrOwnershipOther, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+15) as ErrRelevantShspEmphasisarea, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+16) as ErrRelevantShspEmphasisareaOth, 

hsip.getTempResponseData(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+17) as ErrRelevantShspStrategy, 

hsip.getErrorCount(@nFY_ST_QUESTION_DTL_TABLE_ID, ISNULL(@nROW_NUMBER, 0), @coloffset+17) as ValidationErrorCount, 

@nFY_ST_QUESTION_DTL_TABLE_ID, @nDISPLAY_NUMBER, @nQUESTION_NUMBER, @nQUESTION_PART_NUMBER 

from 
(select QD.FY_ST_QUESTION_DTL_TABLE_ID,qi.display_number,QI.QUESTION_NUMBER, 
           qd.question_part_number 
          from FY_ST_QUESTION_INFO qi, 
           FY_ST_QUESTION_DETAIL qd 
          where qi.region = @cRegion 
          and qi.state_code = @cState_Code 
          and qi.fy = @nFY 
          and qi.report_id = @nREPORT_ID 
          and qi.section_id = @nSECTION_ID 
          and qi.subsection_id = @nSUBSECTION_ID 
          and qi.display_number = @nDISPLAY_NUMBER 
          and qi.QUESTION_NUMBER = @nQUESTION_NUMBER 
          and (QI.REPORTER_ID = @sUSER_ID or 
            QI.DELEGATE_ID = @sUSER_ID or 
            QI.SUB_DELEGATE_ID = @sUSER_ID) 
          and QI.FY_ST_QUESTION_INFO_TABLE_ID = QD.FY_ST_QUESTION_INFO_TABLE_ID 
         )as fq left outer join 
         (select distinct ad.FY_ST_QUESTION_DTL_TABLE_ID, AD.ROW_NUMBER 
          from UPLOAD_TEMP_DATA ad 
          where ad.region = @cRegion 
          and ad.state_code = @cState_Code 
          and ad.fy = @nFY 
          and ad.report_id = @nREPORT_ID 
          and ad.section_id = @nSECTION_ID 
          and ad.subsection_id = @nSUBSECTION_ID 
          and ad.display_number = @nDISPLAY_NUMBER 
          and ad.QUESTION_NUMBER = @nQUESTION_NUMBER 
          and ad.QUESTION_PART_NUMBER = @nQUESTION_PART_NUMBER 
         ) as aq 
+0

@ Raphael:我試着按照你的方式去做:發生錯誤:無法綁定多部分標識符「QD.FY_ST_QUESTION_DTL_TABLE_ID」。 – user3147594

+0

@ user3147594剛剛編輯過,現在好點了嗎? –

+0

剛剛嘗試過,現在得到這個錯誤:ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中是無效的,除非還指定了TOP,OFFSET或FOR XML。 – user3147594