Member 11848548 Ответов: 1

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


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

что я пытаюсь сделать :

сначала я делаю подсчет записей в каждой группе

а потом я поставил условие фильтровать (а.БР&ГТ;=б.УНТ)

это и есть код :
insert into work.discount_tmp 
select 
	SubsID , MSISDN , EppAcc, User_Name , Bill_Cycle, Tariff , Pack ,Discount_Qual_ID ,Discount_ID , Qualification_Type,Discount_Desc,Sequence,a.GroupID,RuleID,dib_band_id,dib_band_end,dib_charge_ref,DIB_DIS0,dib_disc_type,dib_limit_disc,DIB_MAX_,cd_class_type,ClassID,Class,dgh_group_id ,dgh_inclusion_from,dgh_inclusion_to,20191003 
from
(
	(
		select *, row_number() over (partition by GroupID order by Discount_ID ) as seqnum,
			COUNT(*) over (partition by GroupID order by GroupID ) as cnt 
		from 
			work.disc_band 
		where tbl_dt=20191003 
		order by Discount_ID
	) a
	left join
	(
		select *, row_number() over (partition by GroupID order by cd_class_type,try(cast(coalesce(classid,'0') as bigint)) ) as seqnum,
			count(*) over (partition by GroupID order by GroupID  ) as cnt 
		from 
			work.alltable1 
		where tbl_dt=20191003 
	) b 
	on 
	a.GroupID=b.GroupID  and a.cnt>=b.cnt and a.seqnum=b.seqnum   
 )


Но моя попытка не работает, потому что сначала выполняется соединение, а затем условие (так что значение cnt во второй таблице не останется прежним после завершения соединения )

любая идея, как сделать эту работу ?

Что я уже пробовал:

insert into work.discount_tmp select SubsID , MSISDN , EppAcc, User_Name , Bill_Cycle, Tariff , Pack ,Discount_Qual_ID ,Discount_ID , Qualification_Type,Discount_Desc,Sequence,a.GroupID,RuleID,dib_band_id,dib_band_end,dib_charge_ref,DIB_DIS0,dib_disc_type,dib_limit_disc,DIB_MAX_,cd_class_type,ClassID,Class,dgh_group_id ,dgh_inclusion_from,dgh_inclusion_to,20191003 from
 ((select *, row_number() over (partition by GroupID order by Discount_ID ) as seqnum,
 COUNT(*) over (partition by GroupID order by GroupID ) as cnt from work.disc_band where tbl_dt=20191003 order by Discount_ID) a
 left join
 (select *, row_number() over (partition by GroupID order by cd_class_type,try(cast(coalesce(classid,'0') as bigint)) ) as seqnum,
 count(*) over (partition by GroupID order by GroupID  ) as cnt 
 from work.alltable1 where tbl_dt=20191003 ) b 
 on a.GroupID=b.GroupID  and a.cnt>=b.cnt and a.seqnum=b.seqnum   )

Gerry Schmitz

Тогда считай первым. Если подсчеты не сравниваются, не присоединяйтесь.

1 Ответов

Рейтинг:
2

Aarti Meswania

Привет
Это может вам помочь

;WITH finalGrps AS
(
	SELECT temp.GroupID FROM
	(
		SELECT GroupID, COUNT(*) AS _rows FROM work.disc_band WHERE tbl_dt=20191003
		UNION 
		SELECT GroupID, COUNT(*)*-1 AS _rows FROM work.alltable1 WHERE tbl_dt=20191003 
	) as temp
	GROUP BY temp.GroupID
	HAVING SUM(_rows) >= 0
)
SELECT * FROM finalGrps F
INNER JOIN work.disc_band D ON tbl_dt=20191003 AND F.GroupID = D.GroupID
INNER JOIN work.alltable1 A ON tbl_dt=20191003 AND A.GroupID = D.GroupID


Счастливого Кодирования! :)