2012-08-12 116 views
0

我想执行的查询问题是与子查询的存储过程

With getusers As 
    (Select userID from userprofspecinst_v where institutionID IN 
    (select institutionID, professionID from userprofspecinst_v where [email protected]) 
    and professionID IN 
    (select institutionID, professionID from userprofspecinst_v where [email protected])) 

    select username from user where userID IN (select userID from getusers) 

这里就是我想要做的事。给定一个用户ID和一个视图,其中包含用户ID和他们的机构和职业的ID,我想获得其他用户ID也有相同院校ID和职业ID的列表。然后用这个用户ID列表,我想从另一个表(用户)获得与每个用户ID相对应的用户名。我在尝试创建过程时遇到的错误是:“当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式。”我正在采取正确的方法来构建这个查询?

回答

0

下面的查询应该做你想做的事:

SELECT  u.username 

FROM  user AS u 
INNER JOIN userprofspecinst_v AS up ON u.userID = up.userID 
INNER JOIN (SELECT institutionID, professionID FROM userprofspecinst_v 
       WHERE userID = @userID) AS ProInsts 
        ON (up.institutionID = ProInsts.institutionID 
           AND up.professionID = ProInsts.professionID) 

有效的关键部分是最后的INNER JOIN语句 - 这可以构成insitutionsids一张桌子和professsionids用户ID属于。然后,我们使用相同的机构标识和职业标识(ON条件)获取视图中所有匹配的项目,然后将这些项目链接回相应用户标识(第一个JOIN)上的用户表。

您可以针对您感兴趣的每个用户标识运行此操作,或者加入查询结果(您的getusers)(取决于您正在运行的数据库引擎)。

如果您对JOIN's不熟悉,Jeff Atwood的introductory post是一个很好的起点。

JOIN语句有效地允许您显示表格之间的逻辑链接 - userId,institutionID和professionID都是foreign keys的候选人的示例 - 因此,不必不断地子查询每个表并将结果拼凑在一起,而是可以将所有表格链接在一起并过滤到所需的行。这通常是一种更清洁,更可维护的方法(尽管这是意见)。

+0

这样做的窍门,谢谢! – xxyyxx 2012-08-12 22:57:09