子查询内的 SELECT INTO
环境:SQL Server 2005
我有这种类型的请求
SELECT *
FROM user
WHERE EXISTS(
SELECT *
FROM user_access
WHERE user_access.user_id = user.user_id
AND user_access.access IN ('HIGH_LEVEL','MEDIUM_LEVEL')
)
AND EXISTS(
SELECT *
FROM user_service
WHERE user_service.role ='Manager'
AND user.id_user = user_service.user_id
)
AND user.is_active ='True'
但在结果中我还想从子查询中获取结果,所以我考虑了类似的事情
DECLARE @user_access TABLE(user_id int,access nvarchar(30))
DECLARE @user_service TABLE(user_id int,service_id int,role nvarchar(10))
SELECT * FROM user
WHERE EXISTS(
SELECT user_id,access INTO [@user_access]
FROM user_access
WHERE user_access.user_id = user.user_id
AND user_access.access IN ('HIGH_LEVEL','MEDIUM_LEVEL')
)
AND EXISTS(
SELECT user_id , service_id,role INTO @user_service
FROM user_service
WHERE user_service.role ='Manager'
AND user.id_user = user_service.user_id
)
AND user.is_active ='True'
SELECT * FROM @user_acess
select * from @user_service
但我收到以下错误:
“关键字“INTO”附近的语法不正确。”
你知道我如何在不执行两次子查询的情况下做到这一点吗(我尝试使用临时表,同样的错误)?
编辑:我对试图解决我的问题的同事感到抱歉,我忘记了一件事:我有 2 个子查询。查看请求。我想要:
- 所有具有高或中访问权限且担任管理员的活跃用户
- 这些用户所在的所有服务
- 这些用户的所有访问权限
Environment : SQL Server 2005
I have this type of request
SELECT *
FROM user
WHERE EXISTS(
SELECT *
FROM user_access
WHERE user_access.user_id = user.user_id
AND user_access.access IN ('HIGH_LEVEL','MEDIUM_LEVEL')
)
AND EXISTS(
SELECT *
FROM user_service
WHERE user_service.role ='Manager'
AND user.id_user = user_service.user_id
)
AND user.is_active ='True'
But in the result I'd also like to get the result from the subquery, so I though about something like
DECLARE @user_access TABLE(user_id int,access nvarchar(30))
DECLARE @user_service TABLE(user_id int,service_id int,role nvarchar(10))
SELECT * FROM user
WHERE EXISTS(
SELECT user_id,access INTO [@user_access]
FROM user_access
WHERE user_access.user_id = user.user_id
AND user_access.access IN ('HIGH_LEVEL','MEDIUM_LEVEL')
)
AND EXISTS(
SELECT user_id , service_id,role INTO @user_service
FROM user_service
WHERE user_service.role ='Manager'
AND user.id_user = user_service.user_id
)
AND user.is_active ='True'
SELECT * FROM @user_acess
select * from @user_service
But I get the following error :
"Incorrect syntax near the keyword 'INTO'."
Do you have any idea how I can do it without doing twice the subquery (I tried with a temp table, same error) ?
EDIT : I'm sorry for my fellow who tried to solve my problem, I forget one thing : I have 2 subquery. See the requests. I want :
- All the active user, with high or medium access and who are manager
- All the service in which these users are
- All the access of these users
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
临时表或变量似乎是最简单的解决方案。将子查询的结果填充到临时表或变量中,然后在过程末尾执行两个 select 语句。
根据原始问题的扩展进行更新
两个子查询的解决方案本质上与一个子查询的解决方案相同,只是您返回三个而不是两个结果集。和以前一样,每个子查询使用临时表/变量:
A temp table or variable would appear to be the simplest solution. Stuff the results of the subquery into a temp table or variable and then execute two select statements at the end of your procedure.
Update given your expansion of the original question
The solution for two subqueries is essentially the same as with one except that instead of returning two resultsets, you return three. As before, you use a temp table/variable per subquery:
您可以拉出子查询来创建临时表,然后从临时表中执行您想要的两个查询。
You can pull the subquery out to make the temp table, then do the two queries you want out of the temp table.
这是您可以做的最好的优化。无法捕获和保留 EXISTS 子查询中的数据 - 尤其当 EXISTS 未完全评估结果集时。当在子查询中找到单个匹配项(用户的一个
访问
)时,它会短路,因此您无论如何都无法从中获取所有访问
记录。This is about the best you can do to optimize. There is no way to capture and retain the data in the EXISTS subqueries - especially when EXISTS does not fully evaluate the result set. It short circuits when a SINGLE match is found in the subquery (one
access
for the user) so you can't get all theaccess
records from it anyway.这是 Ken Down^ 建议的实现,我认为它考虑到您的需求,结果不应包含任何无关的行。
Here's an implementation of what Ken Down^ has suggested and I think its result should not contain any extraneous rows, considering what you are after.
这应该返回两个表的结果集。
This should return the result set from both tables.