Хорошо, я надеюсь, что смогу объяснить этот вопрос достаточно хорошо, потому что чувствую, что это будет непросто.
У меня есть две таблицы, с которыми я сегодня работаю. Это выглядит так:
@pset table (PersonID int, SystemID int, EntitlementID int, TargetID int)
@Connector table (TargetName varchar(10), fConnector bit)
В первой таблице хранятся записи, которые говорят мне, о, у этого человека есть эта система, которая состоит из этих прав, у которых есть эти цели. Немного сложно, но оставайся со мной. Второй хранит TargetName, а затем указывает, есть ли у этой цели разъем в моей не теоретической системе.
Я пытаюсь объединить эти две таблицы, чтобы я мог видеть флаг цели для каждой строки в @pset. Это поможет мне позже, как вы увидите.
Если у каждого права в системе есть соединитель с целью (флаг для всех из них равен true ), я бы хотел знать.
Все остальные должны пойти в другой стол.
Это то, что я пытался сделать, но это не сработало. Мне нужно знать, где я ошибся. Надеюсь, кто-то с большим опытом, чем я, сможет ответить.
-- If the count(123) = 10 (ten rows with SystemID = 123) and the sum = 10, cool.
select pset.*, conn.fConnector from @pset pset
inner join vuTargets vt
on vt.TargetID = pset.TargetID
inner join @conn conn
on conn.TargetName = vt.TargetName
group by ProfileID, SystemRoleID, EntitlementID, TargetID, fConnector
having count(SystemID) = sum(cast(fConnector as int))
order by ProfileID
и
-- If the count(123) = 10 (ten rows with SystemID = 123) and the sum <> 10
select pset.*, conn.fConnector from @pset pset
inner join vuTargets vt
on vt.TargetID = pset.TargetID
inner join @conn conn
on conn.TargetName = vt.TargetName
group by ProfileID, SystemRoleID, EntitlementID, TargetID, fConnector
having count(SystemID) <> sum(cast(fConnector as int))
order by ProfileID
К сожалению, они не работают: (
Редактировать
Вот скриншот, показывающий проблему. Обратите внимание, что ProfileID 1599 имеет SystemID 1126567, но одно из прав не имеет соединителя! Как я могу получить обе эти строки во втором запросе? (Выше)