我想要执行的查询是
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时,只能在选择列表中指定一个表达式。”。我是否采用了正确的方法来构建此查询?
答案 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的候选者的例子 - 所以,而不是必须不断地子查询每个表并分割结果在一起,您可以将所有表链接在一起并过滤到您想要的行。它通常是一种更清洁,更易于维护的方法(虽然这是意见)。