Listing 1: Solution 1: Normalized Representation WITH DNASeq AS ( BEGIN CALLOUT A SELECT P.pid, D.n AS DNAstart, 1 AS n, D.base FROM dbo.DNA AS D JOIN dbo.Patterns AS P ON P.n = 1 AND D.base = P.base END CALLOUT A UNION ALL BEGIN CALLOUT B SELECT Cur.pid, DNAstart, Cur.n + 1, DNxt.base FROM DNASeq AS Cur JOIN dbo.Patterns AS PNxt ON PNxt.pid = Cur.pid AND PNxt.n = Cur.n + 1 JOIN dbo.DNA AS DNxt ON DNxt.n = DNAstart + PNxt.n - 1 AND DNxt.base = PNxt.base END CALLOUT B ), PromoLen AS ( BEGIN CALLOUT C SELECT pid, MAX(n) AS ln FROM dbo.Patterns GROUP BY pid END CALLOUT C ) BEGIN CALLOUT D SELECT P.pname, DNAstart FROM DNASeq AS DS JOIN PromoLen AS PL ON PL.pid = DS.pid AND PL.ln = DS.n JOIN dbo.Promoters AS P ON P.pid = PL.pid ORDER BY P.pid, DNAstart OPTION (MAXRECURSION 0); END CALLOUT D