Given the following tables:
------------ ------------
| BA | | CA |
------+----- ------+-----
| BId|| AId| | CId|| AId|
One way to do this is to use JOIN
and COUNT
. You first count the CIds (how many times each one of them is repeated). Then, you do the same for BIds. Then, you JOIN BA and link both (AIds) and COUNT. Your target is to match the count of ids and their AIds.
Example :
DECLARE
@a TABLE(id INT)
INSERT INTO @a VALUES
(1),
(2),
(3),
(4),
(5),
(6)
DECLARE
@b TABLE(id CHAR(2))
INSERT INTO @b VALUES
('B1'),
('B2'),
('B3')
DECLARE
@c TABLE(id CHAR(2))
INSERT INTO @c VALUES
('C1'),
('C2'),
('C3')
DECLARE
@ba TABLE(BId CHAR(2), AId INT)
INSERT INTO @ba VALUES
('B1',2),
('B1', 3),
('B2', 2),
('B2', 4),
('B2', 5)
DECLARE
@ca TABLE(CId CHAR(2), AId INT)
INSERT INTO @ca VALUES
('C1',2),
('C2',2),
('C2',3),
('C3',4),
('C3',5)
SELECT DISTINCT CId
FROM (
SELECT *
, COUNT(*) OVER(PARTITION BY CId) cnt
FROM @ca ca
) c
LEFT JOIN (
SELECT *
, COUNT(*) OVER(PARTITION BY BId) cnt
FROM @ba ba
) b ON b.AId = c.AId AND b.cnt = c.cnt
WHERE
b.cnt IS NOT NULL
So, in the example C2 has repeated 2 times, and in BA, B1 has repeated also 2 times. This is the first condition, second one is to match both AIds, if they're the same, then you have a group match.