修改
对不起半个帖子:(
似乎我不能在子查询中使用父查询中的列。 如何重构此查询以获得我需要的内容?
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。
答案 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