2017-05-19 6 views
0

Ich habe eine Frage, die 3 Tabellen hat:Inner Join SQL-Abfrage

1.Review (JobID)

2.Job (Businessnummer)

3.Business (Businessnummer) (Foreign Keys) .

Ich muss Daten abrufen und erstellen Tabelle mit 4 Spalten HighestBusiness, HighestRating, LowestBusiness, Lowest Rating.

select business.businessname AS HIGHESTRATEDBUSINESS, 
     max(review.reviewrating) as HIGHEST 
from business 
    inner join job 
     on job.selectedbusinessabnnumber=business.abnnumber 
    inner join review 
     on review.jobid=job.jobid 
where review.reviewrating = (select max(reviewrating) 
          from review) 
GROUP BY businessname 
UNION 
select business.businessname AS LOWESTRATEDBUSINESS, 
    MIN(review.reviewrating) as HIGHEST 
from business 
    inner join job 
     on job.selectedbusinessabnnumber=business.abnnumber 
    inner join review 
     on review.jobid=job.jobid 
where review.reviewrating = (select MIN(reviewrating) 
           from review) 
GROUP BY businessname 
/

Ich habe nicht erstellt Tabelle jetzt, ich wollte nur die vier Spalten angezeigt werden.

+0

Bitte geben Sie einige Beispiel- und Ausgabedaten an. Gibt Ihre Abfrage irgendwelche Zeilen zurück? – Susang

Antwort

0

Der UNION-Operator erzeugt eine Ergebnismenge aus zwei Sätzen mit der gleichen Projektion. Was Sie brauchen, ist eine neue Projektion von vier Spalten. So schalten Sie die beiden Unterabfragen in Inline-Ansichten und verwenden ein CROSS JOIN:

select h.highestratedbusiness 
     , h.highest 
     , l.lowestratedbusiness 
     , l.lowest 
from 
    (select business.businessname AS HIGHESTRATEDBUSINESS, 
      max(review.reviewrating) as HIGHEST 
    from business 
     inner join job 
      on job.selectedbusinessabnnumber=business.abnnumber 
     inner join review 
      on review.jobid=job.jobid 
    where review.reviewrating = (select max(reviewrating) 
           from review) 
    GROUP BY businessname) h 
cross join 
     (select business.businessname AS LOWESTRATEDBUSINESS, 
      MIN(review.reviewrating) as HIGHEST 
     from business 
      inner join job 
       on job.selectedbusinessabnnumber=business.abnnumber 
      inner join review 
       on review.jobid=job.jobid 
     where review.reviewrating = (select MIN(reviewrating) 
             from review) 
     GROUP BY businessname) l 
/

A CROSS JOIN erzeugt einen Datensatz für jede Kombination von Datensätzen in den verbundenen Sätzen. Dies ist in Ordnung, wenn die Daten ein Geschäft mit der höchsten Bewertung und ein Geschäft mit der niedrigsten Bewertung ergeben. Aber es wird ein kartesisches Produkt erzeugen, wenn an einem oder beiden Orten ein Gleichstand vorliegt. Es gibt verschiedene Möglichkeiten, also verfeinern Sie Ihre Frage, wenn das für Sie eine Blockade ist.

+0

Vielen Dank! Es funktionierte! –