2009-05-12 8 views
0

J'ai une paire de tables SQL Server.Requête SQL Parent-enfant distinct

P contient un identifiant et un nom. PR contient id, interestrate, tiernumber, fromdate, todate et P.id. PR peut contenir plusieurs lignes répertoriées par p.id/tier. (les niveaux sont une liste des taux qu'un produit peut avoir au cours d'une période donnée.)

Par exemple: Le produit 1 de niveau 1 démarre du 1/1/2008 au 1/1/2009 et a 6 taux indiqués 1 rang par taux. Produit 1 niveau 2 commence 1/2/2009 etc etc etc

J'ai besoin d'une vue sur ce qui montre le nom de P. et le PR.tiernumber et les dates ... MAIS je veux seulement une rangée pour représenter le niveau.

C'est facile:

SELECT DISTINCT P.ID, P.PRODUCTCODE, P.PRODUCTNAME, PR.TIERNO, 
    PR.FROMDATE, PR.TODATE, PR.PRODUCTID 
FROM dbo.PRODUCTRATE AS PR INNER JOIN dbo.PRODUCT AS P 
    ON P.ID = PR.PRODUCTID 
ORDER BY P.ID DESC 

Cela me donne les bonnes données exactes ... Cependant: cela me interdit de voir le PR.ID car cela annulerait le distinct.

J'ai besoin de limiter le resultset parce que l'utilisateur doit juste voir juste une liste de niveaux, j'ai besoin de voir le PR.ID affichant toutes les données.

Des idées?

+1

Que voulez-vous dire par "J'ai besoin de voir le PR.ID"? QUI PR.ID, puisqu'il y en a plusieurs par ligne, vous ne pouvez en montrer qu'un. Soit vous avez une rangée par P.ID/Tier, ou par PR.ID. –

+0

Désolé - Je dois retourner à une application un identifiant unique. L'utilisateur veut voir tous les niveaux du produit et veut ensuite en sélectionner un pour être plus complet à l'écran. J'ai besoin de trouver le numéro de niveau de l'élément sélectionné, puis l'utiliser pour récupérer le reste des données ... mais l'application ne peut me donner le numéro de niveau que s'il a l'ID unique. –

Répondre

1
SELECT P.ID, P.ACUPRODUCTCODE, P.PRODUCTNAME, PR.TIERNO, 
    PR.FROMDATE, PR.TODATE, PR.PRODUCTID, MIN(PR.ID) 
FROM dbo.PRODUCTRATE AS PR INNER JOIN dbo.PRODUCT AS P 
    ON P.ID = PR.PRODUCTID 
GROUP BY P.ID, P.ACUPRODUCTCODE, P.PRODUCTNAME, PR.TIERNO, 
    PR.FROMDATE, PR.TODATE, PR.PRODUCTID 
ORDER BY P.ID DESC 

Devrait faire le travail. GROUP BY à la place de DISTINCT, avec une fonction de résumé (MIN) pour obtenir une valeur particulière pour le PR.ID.

+0

Oui, cela renvoie une valeur PR.ID particulière, mais il n'est pas clair à partir de la question OP * quelle * valeur PR.ID dont il a besoin (ce n'est peut-être pas le MIN). Peut-être qu'il va clarifier. –

+0

Je pensais que MIN avait un peu plus de sens que SUM dans ce cas. ;-) –

+0

Monsieur, vous êtes un érudit et un gentleman. Juste essayé ceci et cela fonctionne merveilleusement. Merci beaucoup. –

1

Il semble que vous vouliez accomplir deux choses différentes avec la même requête, ce qui n'a pas de sens. Soit vous voulez une liste d'informations produit/niveau/date ou vous voulez une liste de taux d'intérêt.

Si vous voulez choisir un PR.ID particulier pour aller avec vos données, vous devez décider quelle est la règle pour cela - ce qui détermine quel ID vous voulez récupérer?

+0

Tom, merci. Oui, je suis limité par l'application. Ce que je fais est obtenir une vue de restreindre les options à l'utilisateur afin qu'ils voient juste qu'un produit a eu 5 niveaux. Quand ils décident d'afficher un niveau historique, ils sélectionnent l'option unique et puis j'obtiens tous les taux pour ce niveau ... Je dois offrir à l'application un ID unique afin qu'il puisse me le rendre pour que je puisse courir le prochain aller chercher. –