存储过程的子查询问题

时间:2012-08-12 20:04:49

标签: sql tsql stored-procedures

我想要执行的查询是

With getusers As
    (Select userID from userprofspecinst_v where institutionID IN
    (select institutionID, professionID from userprofspecinst_v where userID=@UserID) 
    and professionID IN 
    (select institutionID, professionID from userprofspecinst_v where userID=@UserID))

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

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

1 个答案:

答案 0 :(得分: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语句 - 这会创建一个表,构成用户ID所属的insitutionsids和professsionids。然后,我们使用相同的机构ID和专业ID(ON条件)获取视图中的所有匹配项,然后将这些项链接回相应用户ID(第一个JOIN)上的用户表。

您可以为您感兴趣的每个用户ID运行此命令,也可以加入查询结果(您的getusers)(这取决于您运行的数据库引擎)。

如果你不熟悉JOIN,杰夫阿特伍德的introductory post是一个很好的起点。

JOIN语句有效地允许你展示表之间的逻辑链接 - userId,institutionID和professionID都是foreign keys的候选者的例子 - 所以,而不是必须不断地子查询每个表并分割结果在一起,您可以将所有表链接在一起并过滤到您想要的行。它通常是一种更清洁,更易于维护的方法(虽然这是意见)。