sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgsel som GROUP BY med OR-betingelse

Her er en komplet løsning ved hjælp af en rekursiv CTE.

;WITH Nodes AS ( SELECT DENSE_RANK() OVER (ORDER BY Part, PartRank) SetId , [ID] FROM ( SELECT [ID], 1 Part, DENSE_RANK() OVER (ORDER BY [E-mail]) PartRank FROM dbo.Customer UNION ALL SELECT [ID], 2, DENSE_RANK() OVER (ORDER BY Phone) PartRank FROM dbo.Customer ) A ), Links AS ( SELECT DISTINCT A.Id, B.Id LinkedId FROM Nodes A JOIN Nodes B ON B.SetId = A.SetId AND B.Id < A.Id ), Routes AS ( SELECT DISTINCT Id, Id LinkedId FROM dbo.Customer UNION ALL SELECT DISTINCT Id, LinkedId FROM Links UNION ALL SELECT A.Id, B.LinkedId FROM Links A JOIN Routes B ON B.Id = A.LinkedId AND B.LinkedId < A.Id ), TransitiveClosure AS ( SELECT Id, Id LinkedId FROM Links UNION SELECT LinkedId Id, LinkedId FROM Links UNION SELECT Id, LinkedId FROM Routes ), UniqueCustomers AS ( SELECT Id, MIN(LinkedId) UniqueCustomerId FROM TransitiveClosure GROUP BY Id ) SELECT A.Id, A.[E-mail], A.Phone, B.UniqueCustomerId FROM dbo.Customer A JOIN UniqueCustomers B ON B.Id = A.Id

  1. Minimering af virkningen af ​​at udvide en IDENTITY-søjle – del 4

  2. Sådan returneres forespørgselsresultater som en kommasepareret liste i SQL Server – STRING_AGG()

  3. Optimer MySQL UPDATE-forespørgsel, der indeholder WHERE og ORDER BY?

  4. Brug af SMO til at kopiere en database og data