2014-06-16 7 views
1

Nous faisons du travail professionnel pour une bonne cause et je m'emballe avec une requête. Le codage a été fait par de nombreux bénévoles au cours des années, ce qui a un résultat inévitable.Je ne veux pas faire la jointure Je veux

J'ai deux tables A et B. Ce que je dois est une somme de de score_hours sur une jointure entre les deux où les données est unique pour chaque instance de seulement A.

S'il vous plaît garder à l'esprit que les deux les tables sont assez grandes (10 à 50k + chacune selon le temps du mois).

Tableau A:

  • id (pk, ai)
  • uid (int)
  • scores_date (horodatage (mais pour une raison que la date réelle, pas le temps))
  • score_hours (décimal 3,1)

Tableau B:

  • id (pk, ai)
  • uid (int)
  • shift_date (timestamp)

Il y a beaucoup de dossiers dans le tableau B qui ont le uid nous recherchons plusieurs dates (la les dates ne sont pas uniques). Le tableau A contient plusieurs enregistrements pour l'uid mais pour des jours différents. Donc, il pourrait avoir 1 uid par jour, mais pas 2 instances de 1 uid par jour.

Il y a évidemment plus de sélecteurs pour les deux tables, mais elles ne correspondent en aucun cas entre les tables (bien que je doive les interroger avec un simple "AND"), donc c'est ce que je dois travailler. Je dois les rejoindre à cause du reste de la requête, mais jusqu'à présent, je ne reçois pas les enregistrements dont j'ai besoin dans un temps décent. Mes tentatives ont été:

Cela a presque réussi. Mais le temps d'exécution était dégoûtant et a échoué avec quelques sélecteurs simples.

SELECT SUM(score_hours) 
FROM A 
WHERE 
A.uid IN 
(SELECT B.uid 
FROM B 
WHERE B.uid = "1") 

Ceci donne la bonne sortie mais il en joint une pour chaque instance d'un uid. Normalement, vous pouvez résoudre cela en groupant, mais la somme comptera tout. Donc, ce n'est pas une option:

SELECT SUM(score_hours) 
FROM A 
LEFT JOIN B ON A.uid = B.uid 
WHERE A.uid = "1" 

* modifier: Non seulement je dois JOIN sur uid, mais il doit y avoir quelque chose comme ça en elle:

DISTINCT(date(m.shift_datum)) = DATE(d.dagscores_date) 

Il est en fait très requête de base, à l'exception du fait qu'un SUM est nécessaire sur un enregistrement qui n'est pas unique en ce qui concerne la jointure Left et que j'ai besoin de JOIN sur deux tables en même temps.

Si vous avez besoin de plus de données s'il vous plaît dites-le moi. Je peux tout fournir.

+0

Pourriez-vous ajouter des exemples de données et la sortie attendue? Pourriez vous aider à clarifier ce que vous essayez d'accomplir ;-) – svvac

Répondre

0

Vous devez supprimer les doublons de la table avec laquelle vous vous joignez, sinon le produit croisé crée plusieurs lignes ajoutées dans la somme.

SELECT SUM(score_hours) 
FROM A 
JOIN (SELECT DISTINCT uid 
     FROM B) AS B 
ON A.uid = B.uid 
+0

Salut Barmar, ce n'est pas la première fois que vous m'aidez ici. J'apprécie beaucoup! Votre requête est très (!) Élégante, mais il semble que j'ai oublié de mentionner quelque chose dans la requête. Je vais éditer la question. – Matt

+0

Salut Barmar, tant pis. En fonction de votre réponse, j'ai trouvé la requête que je cherchais. "SELECT SUM (score_hours) à partir d'un JOIN (SELECT DISTINCT (DATE (shift_date) comme date, uid) que B sur B.datum = A.scores_date WHERE A.uid = B.uid" – Matt

+0

Le point général est le même - – Barmar

Questions connexes