需要在嵌套子查询中使用查询列值

时间:2010-05-24 18:11:12

标签: sql sql-server sql-server-2005

修改
对不起半个帖子:(

似乎我不能在子查询中使用父查询中的列。 如何重构此查询以获得我需要的内容?

dbo.func_getRelatedAcnts返回相关帐户的表格(来自给定帐户的所有子项)。它上升到给定帐户的顶级父帐户,然后从那里选择所有子帐户。这给了我一个包含所有父级,兄弟级和子级帐户ID的表。

事件具有帐户的外键,而个人资料具有帐户的外键。

注册具有外部配置文件密钥和事件密钥。每个配置文件可以有多个reg。我需要找到与帐户中的配置文件相关联的所有注册表,这些配置文件与注册所在的事件无任何层次关联。

问题是我想使用与父查询中的reg相关的配置文件的配置文件帐户密钥来动态获取子查询中的表。

SELECT COUNT(r.reg_id)  
FROM registrations r 
JOIN profiles p ON (r.reg_frn_pro_id = p.pro_id)  
JOIN events e ON (r.reg_frn_evt_id = e.evt_id)  
WHERE evt_frn_acnt_id NOT IN 
      (SELECT * FROM dbo.func_getRelatedAcnts(p.pro_frn_acnt_id))  

我的错误:
    pro_frn_acnt_id不是可识别的表提示选项。如果要将其作为表值函数的参数,请确保将数据库兼容性模式设置为90。

3 个答案:

答案 0 :(得分:0)

不完全确定为什么你有两套括号,并且不确定你想要匹配什么,但是下面两个中的一个应该有效,如果没有,它会让你大致了解需要什么完成。

1)

SELECT COUNT(r.reg_id)
FROM registrations r JOIN profiles p ON (r.reg_frn_pro_id = p.pro_id)  
JOIN events e ON (r.reg_frn_evt_id = e.evt_id)  
WHERE evt_frn_acnt_id NOT IN 
    ( SELECT pro_frn_acnt_id FROM dbo.func_getRelatedAcnts )

2)

SELECT COUNT(r.reg_id)
FROM registrations r JOIN profiles p ON (r.reg_frn_pro_id = p.pro_id)  
JOIN events e ON (r.reg_frn_evt_id = e.evt_id)  
WHERE evt_frn_acnt_id NOT IN 
    ( SELECT evt_frn_acnt_id FROM dbo.func_getRelatedAcnts )

答案 1 :(得分:0)

这对我有用:

CREATE FUNCTION fn_tvf(@input INT)
RETURNS TABLE
AS
        RETURN
        (
        SELECT  @input AS id
        UNION ALL
        SELECT  @input + 1
        )

GO

;WITH    q AS
        (
        SELECT  1 AS id
        ),
        t AS
        (
        SELECT  3 AS id
        )
SELECT  *
FROM    q
CROSS JOIN
        t
WHERE   t.id NOT IN (SELECT  * FROM fn_tvf(q.id))

您收到的确切错误消息是什么?

答案 2 :(得分:0)

确定。我创建了一个额外的函数,它带有两个args,一个用于创建相关acnt_ids的表,另一个用于在结果表中查找。有了这个新功能,我可以像这样重新制定查询

SELECT COUNT(r.reg_id)
FROM registrations r 
JOIN profiles p ON (r.reg_frn_pro_id = p.pro_id)  
JOIN events e ON (r.reg_frn_evt_id = e.evt_id)  
WHERE dbo.func_checkAcntRelation(p.pro_frn_acnt_id, e.evt_frn_acnt_id) = 0