2012-08-01 59 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)