2010-12-13 53 views
1

J'ai un tableau pour chaque type de lieu (ville, rue, pays, etc.).Aide avec UPDATE avec INNER JOIN personnalisé - T-SQL

Maintenant, j'ai une procédure stockée qui doit retourner une liste de "Emplacements", avec leur "revue la mieux notée".

J'ai une table temporaire pour tenir sur les "Emplacements" (pourrait être n'importe quoi - Rue, Ville, etc).

-je insérer dans la table temporaire d'abord des villes, puis les rues, puis les pays, etc.

je me retrouve avec une table temporaire de « Emplacements », et pour chacun de ceux que je besoin de saisir le plus haut Évaluation évaluée. (Le plus élevé = BaseScore, par exemple 5,0)

Cardinalités:

  • Lieu Many..Many Messages (PostLocations se joindre à la table)
  • Poster 1..1 examen
  • examen 1..1 Score

Lieu Temp Tableau:

DECLARE @ResultSet TABLE 
(
    [LocationId]    INT, 
    [TopReviewId]    INT, -- starts out NULL, need to fill in 
    [TopReviewContent]   NVARCHAR(MAX) -- starts out NULL, need to fill in  
) 

-- Get the Top Rated Review for each location. 
    UPDATE  ResultSet 
    SET   TopReviewId = TopReview.PostId, 
       TopReviewContent = TopReview.Content 
    FROM  @ResultSet ResultSet 
    INNER JOIN 
    (
     SELECT TOP 1 pl.LocationId, p.postid, p.Content 
     FROM PostLocations pl 
     INNER JOIN Posts p 
     ON pl.PostId = p.PostId 
     INNER JOIN Reviews r 
     ON p.PostId = r.PostId 
     INNER JOIN Scores s 
     ON r.ScoreId = s.ScoreId 
     INNER JOIN @ResultSet rs 
     ON pl.LocationId = rs.LocationId 
     ORDER BY s.BaseScore DESC 
    ) AS TopReview 
    ON ResultSet.LocationId = TopReview.LocationId 

    INNER JOIN PostLocations pl 
    ON   ResultSet.LocationId = pl.LocationId 
    INNER JOIN Posts p 
    ON   pl.PostId = p.PostId 
    INNER JOIN Reviews r 
    ON   pl.PostId = r.PostId 


    -- Now return the Results: 
    SELECT  TOP 10 
       [LocationId], 
       [TopReviewId],    
       [TopReviewContent]   

    FROM  @ResultSet 

Ceci est la sortie je reçois actuellement

LocationId TopReviewId TopReviewContent 
1    12313   Blah Blah 
2    NULL   NULL 
3    NULL   NULL 

Ceci est la sortie je veux

LocationId TopReviewId TopReviewContent 
1    12313   Blah Blah 
2    44323   Meh meh 
3    5345345  Pew pew 
+0

Est-il nécessaire que votre tâche soit insérée dans une table temporaire? Je pense que vous pouvez trouver le prix maximum par client sans table temporaire. – Ramy

+1

L'instruction UPDATE est source de distraction - quelle est votre sortie attendue? –

+0

Peut-être que je ne devrais pas utiliser des tables/scénarios inventés. Je vais mettre à jour le Q. – RPM1984

Répondre

4

cela est peut-être naïve, mais ont vous avez essayé:

select c.name, max(price) 
from 
    customer c inner join 
    product p on p.customerid = c.customerid 
group by c.name 

si vous voulez que le seul meilleur examen, vous feriez ceci:

SELECT TOP 1 pl.LocationId, p.postid, p.Content 
FROM PostLocations pl 
    INNER JOIN Posts p 
     ON pl.PostId = p.PostId 
    INNER JOIN Reviews r 
     ON p.PostId = r.PostId 
    INNER JOIN Scores s 
     ON r.ScoreId = s.ScoreId 
ORDER BY s.BaseScore DESC 

Si vous voulez le meilleur examen par emplacement, vous feriez ceci:

SELECT pl.LocationId, p.postid, p.Content, max(s.BaseScore) 
FROM PostLocations pl 
    INNER JOIN Posts p  
    ON pl.PostId = p.PostId 
    INNER JOIN Reviews r 
    ON p.PostId = r.PostId 
    INNER JOIN Scores s 
    ON r.ScoreId = s.ScoreId 
group by p1.locationid, p.postid, p.content 
+0

Pouvez-vous vérifier ma mise à jour, est-il logique maintenant? – RPM1984

0

Je suis peu confus quant à ce que vous essayez de faire. mais pour obtenir la liste des clients avec leur numéro de commande le plus élevé, ne pourriez-vous pas faire cela?

select customers.name, orders.orderid 
from customers join orders on customers.customerid = orders.customerid 
group by customers.customerid 
having max(orders.price); 
+0

Pouvez-vous vérifier ma mise à jour, est-ce logique maintenant? – RPM1984