2017-03-17 2 views
1

Dies ist mein erstes Mal in "stackoverflow". Ich fange gerade mein abschließendes Projektprogramm an und habe ein Problem mit der SQL-Abfrage. (Sorry für mein schlechtes Englisch auch)Wie sql Union mit verbundenen Abfrage verwenden

Ich habe drei Tabellen namens zstatistics, zsuggestions und ZEntrycriteria. Ich habe eine SQL-Abfrage, die "UNION" sowohl zstatistics, zsuggestions und dann ordnen Sie die Ergebnisse, um mit dem nächsten Ergebnis übereinstimmen.

select M.* 
      from zstatistics M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
      where C.Maths <= @maths 
      AND C.Science <= @science 
      AND C.English <= @english 
      And C.Ict <= @ict 
      And C.History <= @history 
      And C.Geography <= @geography 
      And C.Art <= @Art 

UNION 

     select M.* 
     from zsuggestions M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
     where C.Maths <= @maths 
      AND C.Science <= @science 
      AND C.English <= @english 
      And C.Ict <= @ict And C.History <= @history 
      And C.Geography <= @geography 
      And C.Art <= @Art 
ORDER BY 

     sqrt(power(M.Maths - @maths, 2) + power(M.Science - @science,2) + power(M.English - @english,2) + power(M.Ict - @ict,2) + power([email protected],2) + power(M.Geography - @geography,2) + power(M.Art - @Art,2)) 

Ich habe auch versucht

folgende
select * from 
(
select M.* 
      from zstatistics M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
      where C.Maths <= @maths 
      AND C.Science <= @science 
      AND C.English <= @english 
      And C.Ict <= @ict 
      And C.History <= @history 
      And C.Geography <= @geography 
      And C.Art <= @Art 

UNION 

     select M.* 
     from zsuggestions M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
     where C.Maths <= @maths 
      AND C.Science <= @science 
      AND C.English <= @english 
      And C.Ict <= @ict And C.History <= @history 
      And C.Geography <= @geography 
      And C.Art <= @Art 
) 
ORDER BY 

     sqrt(power(M.Maths - @maths, 2) + power(M.Science - @science,2) + power(M.English - @english,2) + power(M.Ict - @ict,2) + power([email protected],2) + power(M.Geography - @geography,2) + power(M.Art - @Art,2)) 

aber ich bin ein Syntaxfehler immer sagen: „Ausnahmedetails: System.Data.SqlClient.SqlException: ORDER BY-Elemente in der Auswahlliste, wenn die Anweisung erscheinen müssen enthält einen UNION-, INTERSECT- oder EXCEPT-Operator. "

Danke (bearbeitet)

+0

raten Ihnen nachdrücklich, die Abfrage erhalten zu arbeiten, bevor es in einer Anwendung einbetten. Gehen Sie zurück zu Management Studio und führen Sie die Abfrage aus. Es wird Ihnen bessere Fehlermeldungen geben. – dsz

Antwort

1

Wenn Sie UNION verwenden möchten, setzen Sie es nur zwischen Ihnen abfragen. die endgültige Abfrage würde wie sein

select * from 
(
select M.* 
    from zstatistics M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
    where C.Maths <= @maths 
    AND C.Science <= @science 
    AND C.English <= @english 
    And C.Ict <= @ict 
    And C.History <= @history 
    And C.Geography <= @geography 
    And C.Art <= @Art 

UNION 

select M.* 
from zsuggestions M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
where C.Maths <= @maths 
    AND C.Science <= @science 
    AND C.English <= @english 
    And C.Ict <= @ict 
    And C.History <= @history 
    And C.Geography <= @geography 
    And C.Art <= @Art 
) t 

ORDER BY sqrt(power(t.Maths - @maths, 2) + power(t.Science - @science,2) + power(t.English - @english,2) + power(t.Ict - @ict,2) + power([email protected],2) + power(t.Geography - @geography,2) + power(t.Art - @Art,2)) 

solange beide Abfrageergebnisse die gleichen Spalten haben, dann können Sie UNION sowohl das Ergebnis wie folgt aus.

+0

Vielen Dank für den Vorschlag. Dadurch bekomme ich einen Syntaxfehler "Ausnahmedetails: System.Data.SqlClient.SqlException: Falsche Syntax in der Nähe des Schlüsselwortes 'UNION'." – timton

+0

@timton, das liegt daran, dass man 'order by' nicht vor 'union' haben kann. Entfernen Sie diese Zeile (und Sie müssen eventuell auch die letzte 'Reihenfolge nach'-Zeile nachbearbeiten, damit sie funktioniert). – ZLK

+0

@ ZLK danke für den Kommentar. Könnten Sie mir bitte sagen, was Sie mit "und Sie müssen möglicherweise die letzte Reihenfolge für Zeile auch überarbeiten, um es zum Funktionieren zu bringen". Wenn es möglich ist, kannst du mir ein Beispiel geben. – timton

0

Sie können Union oder Union all dies zwischen diesen beiden Abfragen verwenden, wie von Mark vorgeschlagen. Aber Sie müssen wissen, dass UNION doppelte Datensätze entfernt (wobei alle Spalten in den Ergebnissen gleich sind), UNION ALL nicht.

select M.* 

    from zstatistics M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
    where C.Maths <= @maths 
    AND C.Science <= @science 
    AND C.English <= @english 
    And C.Ict <= @ict 
    And C.History <= @history 
    And C.Geography <= @geography 
    And C.Art <= @Art 

UNION 

select M.* 
from zsuggestions M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
where C.Maths <= @maths 
    AND C.Science <= @science 
    AND C.English <= @english 
    And C.Ict <= @ict 
    And C.History <= @history 
    And C.Geography <= @geography 
    And C.Art <= @Art 

Oder Sie können direkt UNION verwenden ALL, wenn Sie Abfrage doppelte Zeilen zurückgeben möchten:

select M.* 
    from zstatistics M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
    where C.Maths <= @maths 
    AND C.Science <= @science 
    AND C.English <= @english 
    And C.Ict <= @ict 
    And C.History <= @history 
    And C.Geography <= @geography 
    And C.Art <= @Art 

UNION ALL 

select M.* 
from zsuggestions M JOIN ZEntrycriteria C ON M.coursecode=C.Course_code 
where C.Maths <= @maths 
    AND C.Science <= @science 
    AND C.English <= @english 
    And C.Ict <= @ict 
    And C.History <= @history 
    And C.Geography <= @geography 
    And C.Art <= @Art  
+0

Vielen Dank für die Antwort, und ich werde dies in wenigen Stunden versuchen. Also füge ich den "order by" -Teil nur am Ende hinzu?Wird es die beiden Tabellenergebnisse bestellen? – timton

+0

Ja, Sie müssen die Reihenfolge nur einmal verwenden – user2164964