У меня есть две таблицы: #tmpParams, в которой перечислены 29 комбинаций Disability и Grade. Во 2-й таблице, #tmpSource, содержится много учеников с их StudentID, Disability и Grade. Мне нужно выбрать 29 случайных строк из #tmpSource, объединяясь в #tmpParams по Disability and Grade.
Другими словами, кто-то вручил мне список параметров для 29 учеников (инвалидность и класс), и они хотят, чтобы 29 случайных учеников из #tmpSource, включая StudentID, соответствовали двум полям.
Это DDL:
IF OBJECT_ID('tempdb..#tmpParams') IS NOT NULL
BEGIN
DROP TABLE #tmpParams
END
GO
IF OBJECT_ID('tempdb..#tmpSource') IS NOT NULL
BEGIN
DROP TABLE #tmpSource
END
GO
/* Create parameter table */
CREATE TABLE #tmpParams
(
Disability varchar(10)
,Grade varchar(10)
)
GO
/* populate it */
INSERT INTO #tmpParams
(Disability, Grade)
SELECT '13 - AUT' ,'Grade 1' UNION ALL
SELECT '08 - SL' ,'Grade 1' UNION ALL
SELECT '11 - PSD' ,'Grade 1' UNION ALL
SELECT '04 - SLD' ,'Grade 2' UNION ALL
SELECT '04 - SLD' ,'Grade 2' UNION ALL
SELECT '08 - SL' ,'Grade 2' UNION ALL
SELECT '08 - SL' ,'Grade 2' UNION ALL
SELECT '08 - SL' ,'Grade 2' UNION ALL
SELECT '14 - TBI' ,'Grade 2' UNION ALL
SELECT '07 - PD' ,'Grade 2' UNION ALL
SELECT '08 - SL' ,'Grade 3' UNION ALL
SELECT '08 - SL' ,'Grade 3' UNION ALL
SELECT '08 - SL' ,'Grade 3' UNION ALL
SELECT '08 - SL' ,'Grade 3' UNION ALL
SELECT '08 - SL' ,'Grade 3' UNION ALL
SELECT '07 - PD' ,'Grade 3' UNION ALL
SELECT '04 - SLD' ,'Grade 4' UNION ALL
SELECT '04 - SLD' ,'Grade 4' UNION ALL
SELECT '08 - SL' ,'Grade 4' UNION ALL
SELECT '08 - SL' ,'Grade 4' UNION ALL
SELECT '08 - SL' ,'Grade 4' UNION ALL
SELECT '08 - SL' ,'Grade 4' UNION ALL
SELECT '08 - SL' ,'Grade 4' UNION ALL
SELECT '04 - SLD' ,'Grade 5' UNION ALL
SELECT '04 - SLD' ,'Grade 5' UNION ALL
SELECT '04 - SLD' ,'Grade 5' UNION ALL
SELECT '04 - SLD' ,'Grade 5' UNION ALL
SELECT '08 - SL' ,'Grade 5' UNION ALL
SELECT '08 - SL' ,'Grade 5';
GO
/* Create table to hold source */
CREATE TABLE #tmpSource
(
StudentID int
,Disability varchar(10)
,Grade varchar(10)
)
GO
INSERT INTO #tmpSource
(StudentID, Disability, Grade)
SELECT '3', '04 - SLD', 'Grade 2' UNION ALL
SELECT '31', '04 - SLD', 'Grade 2' UNION ALL
SELECT '39', '04 - SLD', 'Grade 2' UNION ALL
SELECT '46', '04 - SLD', 'Grade 2' UNION ALL
SELECT '10', '04 - SLD', 'Grade 4' UNION ALL
SELECT '13', '04 - SLD', 'Grade 4' UNION ALL
SELECT '25', '04 - SLD', 'Grade 4' UNION ALL
SELECT '33', '04 - SLD', 'Grade 4' UNION ALL
SELECT '57', '04 - SLD', 'Grade 4' UNION ALL
SELECT '60', '04 - SLD', 'Grade 4' UNION ALL
SELECT '8', '04 - SLD', 'Grade 5' UNION ALL
SELECT '19', '04 - SLD', 'Grade 5' UNION ALL
SELECT '23', '04 - SLD', 'Grade 5' UNION ALL
SELECT '51', '04 - SLD', 'Grade 5' UNION ALL
SELECT '55', '04 - SLD', 'Grade 5' UNION ALL
SELECT '16', '07 - PD', 'Grade 2' UNION ALL
SELECT '28', '07 - PD', 'Grade 2' UNION ALL
SELECT '36', '07 - PD', 'Grade 2' UNION ALL
SELECT '43', '07 - PD', 'Grade 2' UNION ALL
SELECT '11', '07 - PD', 'Grade 3' UNION ALL
SELECT '14', '07 - PD', 'Grade 3' UNION ALL
SELECT '26', '07 - PD', 'Grade 3' UNION ALL
SELECT '34', '07 - PD', 'Grade 3' UNION ALL
SELECT '58', '07 - PD', 'Grade 3' UNION ALL
SELECT '61', '07 - PD', 'Grade 3' UNION ALL
SELECT '5', '08 - SL', 'Grade 1' UNION ALL
SELECT '21', '08 - SL', 'Grade 1' UNION ALL
SELECT '41', '08 - SL', 'Grade 1' UNION ALL
SELECT '48', '08 - SL', 'Grade 1' UNION ALL
SELECT '2', '08 - SL', 'Grade 2' UNION ALL
SELECT '30', '08 - SL', 'Grade 2' UNION ALL
SELECT '38', '08 - SL', 'Grade 2' UNION ALL
SELECT '45', '08 - SL', 'Grade 2' UNION ALL
SELECT '12', '08 - SL', 'Grade 3' UNION ALL
SELECT '15', '08 - SL', 'Grade 3' UNION ALL
SELECT '27', '08 - SL', 'Grade 3' UNION ALL
SELECT '35', '08 - SL', 'Grade 3' UNION ALL
SELECT '59', '08 - SL', 'Grade 3' UNION ALL
SELECT '62', '08 - SL', 'Grade 3' UNION ALL
SELECT '9', '08 - SL', 'Grade 4' UNION ALL
SELECT '20', '08 - SL', 'Grade 4' UNION ALL
SELECT '24', '08 - SL', 'Grade 4' UNION ALL
SELECT '52', '08 - SL', 'Grade 4' UNION ALL
SELECT '56', '08 - SL', 'Grade 4' UNION ALL
SELECT '7', '08 - SL', 'Grade 5' UNION ALL
SELECT '18', '08 - SL', 'Grade 5' UNION ALL
SELECT '22', '08 - SL', 'Grade 5' UNION ALL
SELECT '50', '08 - SL', 'Grade 5' UNION ALL
SELECT '54', '08 - SL', 'Grade 5' UNION ALL
SELECT '4', '11 - PSD', 'Grade 1' UNION ALL
SELECT '32', '11 - PSD', 'Grade 1' UNION ALL
SELECT '40', '11 - PSD', 'Grade 1' UNION ALL
SELECT '47', '11 - PSD', 'Grade 1' UNION ALL
SELECT '6', '13 - AUT', 'Grade 1' UNION ALL
SELECT '17', '13 - AUT', 'Grade 1' UNION ALL
SELECT '42', '13 - AUT', 'Grade 1' UNION ALL
SELECT '49', '13 - AUT', 'Grade 1' UNION ALL
SELECT '53', '13 - AUT', 'Grade 1' UNION ALL
SELECT '1', '14 - TBI', 'Grade 2' UNION ALL
SELECT '29', '14 - TBI', 'Grade 2' UNION ALL
SELECT '37', '14 - TBI', 'Grade 2' UNION ALL
SELECT '44', '14 - TBI', 'Grade 2';
GO
Это заполняет 29 студентов в #tmpParams и 62 в #tmpSource. Мой реальный сценарий, конечно, намного сложнее.
Я могу достаточно легко получить 29 случайных учеников из #tmpSource ... но как мне присоединиться к #tmpParams, чтобы получить 29 учеников, которые совпадают в двух полях?
SELECT TOP 29
TS.StudentID
,TS.Disability
,TS.Grade
FROM #tmpSource AS TS
ORDER BY NEWID();
GO
Как всегда, спасибо за вашу помощь, и, пожалуйста, дайте мне знать, если я смогу кое-что прояснить или сделать это легче для чтения.