2012-08-01 63 views
1

我真的不確定這個標題是否是我想說的,但它是最接近我能來的。我想要做的是從查詢中獲取初始結果,並在INSERT語句中的嵌套Select語句中使用它們。這裏是我的例子: 這是我最初的查詢,它給了我我正在尋找一個正確的作品;在嵌套SELECT語句中使用SQL結果變量

SELECT Min(Inquirer.ID) as MinID, Max(Inquirer.ID) as MaxID, 
    Min(Inquirer.Program) as MinProg, Max(Inquirer.Program) as MaxProg, 
    COUNT(Inquirer.Name) AS NumOccurrences 
    FROM Inquirer 
    GROUP BY Inquirer.Name 
    HAVING (COUNT(*) = 2) 

結果顯示如下;

MinID   MaxID   MinProg   MaxProg   NumOccurrences 
27    81   Pavilion   Appleton    2 

我想用MinID和MaxID值,我與一個嵌套的SELECT是這樣的一個相應的插件檢索;

Insert into Transfer(InquiryID_fk, ReferElsewhere, ReferMcLean, ReferExternal, ReferredFrom, TransferInquiryID_fk) 
Values(SELECT Inquiry.ID from Inquiry 
Where Inquiry.InquirerID_fk = MinID,'Yes',MaxProg,NULL,MinProg, 
SELECT Inquiry.ID from Inquiry WHERE Inquiry.InquirerID_fk = MaxID) 

這是真的它概括地說,不知道是否可以實現或如何完成它,我將不得不作出一個臨時表事先並遍歷,要得到的值? 任何幫助表示讚賞,感謝你在前進,

NickG

回答

0

使用新表解決您的問題,但我不建議,因爲將太多的嵌套選擇添加到您的查詢,這可能會降低性能。

在你的情況我想創建一個存儲過程,這個

  • 兩個變量建立這個存儲過程:MinIdMaxId
  • 在您的第一選擇(你得到minid和maxId )設置這些變量的值

他們,您的查詢,使用這些變量:

Insert into Transfer(InquiryID_fk, ReferElsewhere, ReferMcLean, ReferExternal, ReferredFrom, TransferInquiryID_fk) 
SELECT Inquiry.ID from Inquiry Where Inquiry.InquirerID_fk = @MinID 
,'Yes' 
,MaxProg 
,NULL 
,MinProg 
,SELECT Inquiry.ID from Inquiry WHERE Inquiry.InquirerID_fk = @MaxID 
2

不要在這種情況下使用VALUES,請使用直INSERT INTO()... SELECT。

E.g.

INSERT INTO Transfer(InquiryID_fk, ReferElsewhere, ReferMcLean, ReferExternal, ReferredFrom, TransferInquiryID_fk) 
SELECT Min(Inquirer.ID), 'Yes', Max(Inquirer.Program), NULL,  Min(Inquirer.Program), Max(Inquirer.ID) 
    FROM Inquirer 
    GROUP BY Inquirer.Name 
    HAVING (COUNT(*) = 2) 
0

這應該有效。

;with cte as 
(
    SELECT Min(Inquirer.ID) as MinID, Max(Inquirer.ID) as MaxID, 
    Min(Inquirer.Program) as MinProg, Max(Inquirer.Program) as MaxProg, 
    COUNT(Inquirer.Name) AS NumOccurrences 
    FROM Inquirer 
    GROUP BY Inquirer.Name 
    HAVING (COUNT(*) = 2) 
) 
    Insert into Transfer 
    (InquiryID_fk, ReferElsewhere, ReferMcLean, ReferExternal, ReferredFrom, TransferInquiryID_fk) 
    SELECT imin.id,'Yes',MaxProg,NULL,MinProg,imax.ID 
    from cte 
     inner join inquiry imin on MinID = imin.inquirer_Id 
     inner join inquiry imax on MaxID = imax.inquirer_Id 

但你要什麼,我認爲是選擇讀...

SELECT imin.id,'Yes',qmax.Program,NULL,qmin.Program,imax.ID 
    from cte 
     inner join inquiry imin on MinID = imin.inquirer_Id 
       inner join inquirer qmin on minid = qmin.id 
     inner join inquiry imax on MaxID = imax.inquirer_Id 
       inner join inquirer qmax on minid = qmax.id 

...但它取決於該SQL的各種你有

+0

非常感謝您的建議,這項工作正如我所需要的。但是,有一件事令我困惑,看起來似乎有一半結果集向後給我MinProg和MaxProg,基本上MinProg應該是與MinID相關的程序,而MaxProg與MaxID相關聯,但是當它顯示MinProg時,程序與MaxID相關聯,反之亦然,任何想法爲什麼這可能是?再次感謝您對我的初始問題的幫助 – 2012-08-02 14:11:57

+0

這是基於您使用Min(詢問者)的原始查詢。程序)作爲MinProg - 它不會以最低的ID返回程序,而是按字母順序返回程序。讓我編輯上面的... – podiluska 2012-08-02 14:14:53

+0

請參閱上面的編輯答案 – podiluska 2012-08-02 14:20:32

1

與此代碼嘗試

Insert into Transfer(
InquiryID_fk, 
ReferElsewhere, 
ReferMcLean, 
ReferExternal, 
ReferredFrom, 
TransferInquiryID_fk) 
SELECT Min(Inquirer.id), `yes`,Max(Inquirer.Program), null, Min(Inquirer.Program), Max(Inquirer.ID) 
FROM Inquirer 
GROUP BY Inquirer.Name 
HAVING (COUNT(*) = 2)