Eu tenho uma mesa [CourseMaster]
LIKE
CourseId CourseName
-----------------------
01 ABC
02 DEF
03 GHI
04 JKL
05 MNO
06 PQR
07 STU
E eu tenho outra tabela [StudentMaster]
para detalhes do aluno LIKE
ROLLNO NAME ADDRESS Course
------------------------------------------------
12345 RAM RAM ADDRESS 01,02,06
25695 HARI HARI ADDRESS 02,06
89685 JEFF JEFF ADDRESS 03,05,06,07
47896 DAISY DAISY ADDRESS 03
Aqui eu quero buscar os detalhes do aluno com CourseName
(Not CourseId
).
Se os valores em Course
não forem separados por vírgula, seria muito simples query
buscar os detalhes com join.
A partir do meu conhecimento, posso executar dois queries
para o mesmo resultado que quero, uma consulta para buscar os detalhes do aluno [StudentMaster]
no front-end. E outro para apenas buscar o CourseName
de [CourseMaster]
correspondendo CourseId
através de um loop.
Mas o fato de eu querer o resultado por apenas um query
ao invés de escrever dois queries
para esta pequena tarefa.
Acho que é 100% possível. E meu resultado esperado será:
ROLLNO NAME ADDRESS Course
-------------------------------------------
12345 RAM RAM ADDRESS ABC,DEF,PQR
25695 HARI HARI ADDRESS DEF,PQR
89685 JEFF JEFF ADDRESS GHI,MNO,PQR,STU
47896 DAISY DAISY ADDRESS GHI
Obrigado e qualquer sugestão valiosa será muito apreciada.
Você realmente deveria ter uma tabela de junção para os cursos que um aluno está fazendo, em vez de agrupar valores separados por vírgulas em uma única tupla. Se você acha que esse é o último problema que terá por causa desse design abaixo do ideal, terá uma grande surpresa. Você realmente deveria fazer com que os proprietários deste projeto lessem sobre normalização - sim, é doloroso alterar seu esquema, mas também está constantemente lidando com as limitações de deixá-lo como está.
De qualquer forma, com isso dito, você precisa de uma função de divisão. Como seus valores separados por vírgula são numéricos, você pode se safar com uma variação da minha função XML; há vários outros para escolher nesta postagem do blog .
Agora, sua consulta é:
Novamente, esta é uma solução complicada e, devido à sua estrutura de banco de dados inferior, a próxima consulta que você precisa executar será igualmente complicada e complicada. Há uma razão pela qual esse tipo de design é contestado em quase todos os blogs, ensaios ou livros sobre o assunto...
Em versões mais modernas (SQL Server 2017 e superior), você pode combinar
STRING_AGG()
eSTRING_SPLIT()
tornar isso um pouco mais simples:Mesma solução que a fornecida por Aaron Bertrand quando se trata de construir os valores separados por vírgula, mas um pouco diferente na conexão
CourseMaster.CourseId
com os valores emStudentMaster.Course
.SQL Fiddle
Configuração do esquema do MS SQL Server 2014 :
Pergunta 1 :
Resultados :
Uma maneira simples de obter os valores da lista da
StudentMaster
tabela (e você pode juntar os resultados) seria (com a ajuda de uma string dividida como mencionado nas respostas anteriores, e assumindo que a função retorna uma coluna chamada item para cada item da lista) :