在嵌套SELECT语句中使用SQL结果变量
问题描述:
我真的不确定这个标题是否是我想说的,但它是最接近我能来的。我想要做的是从查询中获取初始结果,并在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
答
使用新表解决您的问题,但我不建议,因为将太多的嵌套选择添加到您的查询,这可能会降低性能。
在你的情况我想创建一个存储过程,这个
- 两个变量建立这个存储过程:
MinId
和MaxId
- 在您的第一选择(你得到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
答
不要在这种情况下使用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)
答
这应该有效。
;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的各种你有
答
与此代码尝试
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)
非常感谢您的建议,这项工作正如我所需要的。但是,有一件事令我困惑,看起来似乎有一半结果集向后给我MinProg和MaxProg,基本上MinProg应该是与MinID相关的程序,而MaxProg与MaxID相关联,但是当它显示MinProg时,程序与MaxID相关联,反之亦然,任何想法为什么这可能是?再次感谢您对我的初始问题的帮助 – 2012-08-02 14:11:57
这是基于您使用Min(询问者)的原始查询。程序)作为MinProg - 它不会以最低的ID返回程序,而是按字母顺序返回程序。让我编辑上面的... – podiluska 2012-08-02 14:14:53
请参阅上面的编辑答案 – podiluska 2012-08-02 14:20:32