Ho due tabelle in sql. Una è una tabella di casi di test e l'altra è una tabella di esecuzioni di test con una chiave esterna che rimanda a un caso di test. Voglio ottenere le ultime 10 serie di test per ogni caso di test. Non voglio collegarmi se non devo, ma non vedo nessun altro modo per risolvere questo problema. Qual è il modo più efficace per gestire questo tipo di cose in SQL Server?Come seleziono un dato numero di righe per una tabella per ogni chiave primaria genitore in un'altra tabella in sql server 2012?
7
A
risposta
7
L'idea:
select
...
from <test cases> as tc
outer apply (
select top 10 *
from <test runs> as tr
where
tr.<test case id> = tc.<id>
order by tr.<date time> desc
) as tr
o, se avete solo bisogno di ottenere i dati dalla tabella:
;with cte_test_runs as (
select
*,
row-Number() over(partition by <test case id> order by <date time> desc) as rn
from <test runs>
)
select *
from cte_test_runs
where rn <= 10
+0
Il secondo ha funzionato alla grande per me. Grazie Roman. –
3
È possibile utilizzare Row N. Uso interno di LEFT JOIN a seconda dei casi può essere.
Select * from testCase a
left outer join
(Select Row_number() over (partition by testcase order by RecentDate desc) RowNo, * from TestRuns) b
on a.pk = b.fk
where b.RowNo <=10
1
È possibile utilizzare CROSS APPLY per selezionare i primi 10 per testCase ordinati per data (o altri criteri di ordinazione).
Vedere la domanda relativa "Quando è necessario utilizzare Cross Apply su Inner Join?" che lo spiega meglio di me. https://stackoverflow.com/a/1139231/1620715
Nel tuo caso:
SELECT * from TestCase T
CROSS APPLY
(SELECT TOP 10 * from TestRuns R where T.TestCaseId = R.TestCaseId
order by R.TestDate desc) TopResults
Abul e grazie romani per la rapida risposta. Ho intenzione di provare entrambi e farti sapere i risultati –