J'ai trois tables: appels, pièces jointes et notes et je souhaite tout afficher dans la table d'appels, mais affichez également si un appel a des pièces jointes et si l'appel a des notes. - en déterminant s'il y a une pièce jointe ou un enregistrement de note avec un appel_id. Il pourrait y avoir des notes et des pièces jointes, ou il peut ne pas y avoir, mais j'aurais besoin de savoir.
Tables Structure: P>
Appels: P>
SELECT c.call_id , title , description , count(attach_id) FROM calls c LEFT JOIN attachments a ON c.call_id = a.call_id GROUP BY c.call_id , title , description
6 Réponses :
Ne serait-il même pas plus rapide lorsque vous sélectionneriez une clé primaire dans existez () code> instruction au lieu de toutes les colonnes
* code>?
@Robert - Non. C'est un mythe.
@Martin: Mais c'est une très bonne pratique, surtout si vous utilisez EF du côté du client où il fait une énorme différence b>.
Hé, toutes les bonnes réponses les gars. Celui-ci a été publié en premier et je vais aller avec votre efficacité ici Martin - mais je vais utiliser la clé principale de Robert a mentionné. Merci les gars.
oh et devait le changer à "où n.call_id = c.call_id"
@ROBERT - Je n'ai pas utilisé EF alors n'avez absolument aucune idée de la raison pour laquelle il devrait faire une différence. Dans un examen d'existence, il n'y a absolument aucune différence si vous utilisez SELECT 1 code>,
Sélectionnez NULL code>,
SELECT * CODE> ou
Sélectionnez PK CODE > cependant.
@Martin: Tu as raison. J'ai eu ces problèmes avec Orderby + Skip + Prendre la pagination avec tout le nombre d'articles dans EF. Vous pouvez regarder ici et voir ce que je parle de. Stackoverflow.com/Questtions/2493900/... bien qu'il n'a pas grand-chose à faire avec les choses écrites ici.
SELECT c.call_id, title, description, a.call_id, n.call_id FROM calls c LEFT JOIN attachments a ON c.call_id = a.call_id LEFT JOIN notes n ON c.call_id = n.call_id GROUP BY c.call_id,title,description, a.call_id, n.call_id If call id is present in fiels 4 or 5, you know you have an attachement or a noteIf you need to number of attachement or note, look at other answers, look at AtaTheDev's post.
distinct code> dans les comptes Vous devez utiliser des comptes distincts car vos groupes ont grandi par deux entités différentes. Donc, vous devez seulement compter des valeurs distinctes de chacun. Cette requête suivante reviendra à la fois des comptes ainsi que des valeurs bit code> s'il existe des pièces jointes et des notes. P> select
c.call_id, c.title, c.description,
count(distinct a.attach_id) as attachments_count,
count(distinct n.note_id) as notes_count,
/* add these two if you need to */
case when count(distinct a.attach_id) > 0 then 1 else 0 end as has_attachments,
case when count(distinct n.note_id) > 0 then 1 else 0 end as has_notes
from calls c
left join attachments a
on (a.call_id = c.call_id)
left join notes n
on (n.call_id = c.call_id)
group by c.call_id, c.title, c.description
Personne votée Cette baisse devrait fournir un commentaire. Je ne vois pas pourquoi ma réponse n'est pas correcte?
Je pense que ça devrait être quelque chose comme ça p>
Sélectionnez C.Call_ID, Titre, Description, Nombre (Attach_Id distinct), Compte (Note_Id distincte)
Des appels C
Joindre des pièces jointes A sur C.Call_id = A.CALL_ID
Notes de jointure gauche n sur n.call_id = a.call_id
Groupe par c.call_id, titre, description
code> p>
Cela fonctionne également:
SELECT cl.*, (SELECT count(1) FROM attachments AS at WHERE at.call_id = cl.id) as num_attachments, (SELECT count(1) FROM notes AS nt WHERE nt.call_id = cl.id) as num_notes, FROM calls AS cl
J'ai utilisé cette requête simple. Cette requête vous permet d'utiliser facilement des colonnes de tables principales sans groupe par.
Select StudentName,FatherName,MotherName,DOB,t.count from Student left JOIN ( Select StudentAttendance.StudentID, count(IsPresent) as count from StudentAttendance group by StudentID, IsPresent ) as t ON t.StudentID=Student.StudentID