J'ai une exigence où je devrais comparer la rangée supérieure avec les rangées précédentes d'enregistrements de base de données dont ils sont séparés par des virgules. exemple: Mes données de table ressemble à ceci:Comparer les lignes séparées par des virgules
ID Phase Updated By
1 Test1,Test2,Test3 sxmalla
2 Test1,Test2 rkgauta
3 Test1,Test3 sxmalla
Je dois afficher Somthing les plus récents changements de phase et qui a updated.The données par des virgules seperated est soumis à plusieurs chechboxes en fin avant. L'utilisateur peut les mettre à jour via plusieurs cases à cocher dans la même page. Ici Test3 est le changement le plus récent, puis en dessous Test2 est le changement le plus récent et sur la troisième ligne la première entrée réelle.
-je présenter le résultat comme
Phase Updated By
Test3 sxmalla
Test2 rkgauta
Test1,Test3 sxmalla
Voici le code que j'utilise actuellement pour comparer deux virgule lignes seperated
ALTER Proc [dbo].[PMT_GetPhasesEditHistory]
@Project_ID int
As Begin
SET NOCOUNT ON
Declare @added varchar(1000), @removed varchar(1000),@strN varchar(1000),@strO varchar(1000)
DECLARE test_cursor CURSOR FOR
SET @strO=(SELECT TOP 1 P1.Phase from phase P1,Phase P2 where P1.ID = P2.ID-1 and [email protected]_ID order by p1.ID Desc)
SET @strN =(SELECT TOP 1 P2.Phase from phase P1,Phase P2
where P1.ID = P2.ID-1 and [email protected]_ID order by p1.ID Desc)
If object_id('dbo.#tN') is not null Begin ; drop table dbo.#tN ;End
CREATE TABLE dbo.#tN(var varchar(100)); insert into #tN select * from fnSplitStringAsTable(@strN,',')
If object_id('dbo.#tO') is not null Begin; drop table dbo.#tO ;End
CREATE TABLE dbo.#tO (var varchar(100)); insert into #tO select * from fnSplitStringAsTable(@strO,',')
Declare @i int
Set @i=1
Set @added = ''
While @i != (select COUNT(*)+1 from #tN)
Begin
if not exists(select VAR from #tO where var = (select Top 1 var from #tN where var in (Select Top (@i) VAR from #tN where Var in (Select Top (@i) var From #tN order by VAR desc) order by var asc)))
Begin
Set @added = @added + (select Top 1 var from #tN where var in (Select Top (@i) VAR from #tN where Var in (Select Top (@i) var From #tN order by VAR desc) order by var asc)) + ','
End
set @[email protected]+1
End
If(len(@added) > 1) Begin; set @added = RTRIM(LEFT(@added,Len(@added) - 1)); End
Select @added as Added
drop table #tN;Drop table #tO
End
s'il vous plaît considérer normaliser vos données en premier. divisez vos données séparées par des virgules en colonne réelle et probablement une autre table – mvp
Donc, généralement, vous devez comparer la dernière ligne (3) avec la ligne précédente (2) et extraire ce que "nouveau" a été ajouté dans la ligne (2) . Puis comparer la rangée (2) avec la rangée (1) et vérifier à nouveau ce que "nouveau" a été ajouté dans la rangée (1)? c'est ce que tu veux? – gotqn
alors pouvez-vous suggérer comment puis-je faire cela @MVP ?? – user1894745