Как проверить несколько идентификаторов из результатов в нескольких столбцах идентификаторов подряд в SQL? - PullRequest
2 голосов
/ 20 октября 2011

У нас есть таблица счетов. Счет-фактура имеет владельца и клиента, оба поля идентификатора которого связаны с таблицей ресурсов. Таблица ресурсов содержит предприятия, которые могут иметь дочерние предприятия. У меня есть запрос, который проверяет, находится ли текущий бизнес в owner_id или customer_id, например:

SELECT * FROM invoices i WHERE @BusinessId IN ( i.owner_id, i.customer_id )

Проблема, с которой я столкнулся на данный момент, заключается в том, что мне нужно проверить, указан ли бизнес или его дочерние предприятия в owner_id или customer_id. У нас есть функция, которая возвращает таблицу, содержащую бизнес-идентификаторы из таблицы ресурсов, если я сделаю запрос следующим образом:

select business_id from  dbo.vfn_child_business(@BusinessId , 'Y')

Параметр 'Y' в основном возвращает основного родителя вместе с идентификаторами дочерних предприятий в результатах (по сути, ищет дочерние предприятия в бизнесе и включает себя).

Я не могу понять, как запросить, чтобы сказать

SELECT * from Invoices
where ANY OF MY RESULTS FROM CHILD BUSINESS FUNCTION IN ( i.owner_id, i.customer_id ).

Я пробовал:

... WHERE (select business_id 
           from  dbo.vfn_child_business(@BusinessId , 'Y'))
    IN ( i.owner_id, i.customer_id )

Но я получаю эту ошибку:

Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется как выражение.

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Я не проверял это, но предикат EXISTS может помочь здесь:

WITH children AS
    (SELECT business_id
     FROM dbo.vfn_child_business(@BusinessId , 'Y'))
SELECT
    i.*
FROM
    Invoices AS i
WHERE
    EXISTS
        (SELECT 1
         FROM children
         WHERE children.business_id IN ( i.owner_id, i.customer_id ))
0 голосов
/ 20 октября 2011

Вы пытались просто присоединить функцию к таблице?

SELECT
  invoices.*
FROM
  invoices
INNER JOIN
  dbo.vfn_child_business(@BusinessId , 'Y')  AS child_business
    ON invoices.owner_id    = child_business.business_id
    OR invoices.customer_id = child_business.business_id

Если это может привести к дублированию, используйте DISTINCT или GROUP BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...