Необходимо использовать значение столбца запроса во вложенном подзапросе - PullRequest
1 голос
/ 24 мая 2010

РЕДАКТИРОВАТЬ
Извините за половину сообщения :(

Кажется, я не могу использовать столбец из родительского запроса в подзапросе. Как я могу реорганизовать этот запрос, чтобы получитьчто мне нужно?

dbo.func_getRelatedAcnts возвращает таблицу связанных учетных записей (все дочерние элементы данной учетной записи). Она переходит в родительскую учетную запись верхнего уровня данной учетной записи и затем выбирает все дочерние учетные записи.Это дает мне таблицу всех идентификаторов родительских, родных и дочерних учетных записей.

События имеют внешний ключ к учетной записи, а профили имеют внешний ключ к учетным записям.

У регистраций есть внешнийключ профиля и ключ события. Для каждого профиля может быть несколько регистров. Мне нужно найти все регистры, связанные с профилями в учетных записях, которые никоим образом не связаны иерархически с событием, в котором происходит регистрация.

Проблема в том, что я хочу использовать ключ учетной записи профиля для профиля, связанного с 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 голосов
/ 24 мая 2010

Это работает для меня:

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))

Какое точное сообщение об ошибке вы получаете?

0 голосов
/ 25 мая 2010

Хорошо. Я создал дополнительную функцию, которая принимает два аргумента: один для создания таблицы связанных 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
0 голосов
/ 24 мая 2010

Не совсем уверен, почему у вас есть два набора скобок, и не знаете, что вы пытаетесь сопоставить, но одно из следующих двух должно сработать, и если нет, оно даст вам общее представление о том, что нужнобыть сделано.

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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...