2010-11-30 5 views
5

Ich habe zwei Tabellen. Einer ist eine Tabelle der Berichte, die uns vorgelegt wurden. Eine andere ist eine temporäre Tabelle mit den Aufzeichnungen der Berichte, die uns schließlich vorgelegt werden sollten. Ich möchte nur die Datensätze in der temporären Tabelle anzeigen, die nicht mit denen in der Berichtstabelle übereinstimmen (so werden die Berichte angezeigt, die noch gesendet werden müssen).Abfrage zeigt Datensätze, die nicht zwischen Tabellen übereinstimmen

Beispiel Daten:

Reports table: 

CREATE TABLE [dbo].[Reports] 
( 
    [ReportID] [int] IDENTITY(1,1) NOT NULL, 
    [ReportDate] [date] NULL, 
    [AssessmentID] [int] NOT NULL, 
    [ReportType] [varchar](50) NULL 
); 

AssessmentID ReportType ReportID 
1 1st Quarterly 27 
2 1st Quarterly 30 
2 2nd Quarterly 31 
2 3rd Quarterly 32 

QuarterlyReportsDue table: 

CREATE TABLE #QuarterlyReportsDue 
( 
AssessmentID INT, 
InstallationDate DATE, 
QuarterlyReportType VARCHAR(50) 
); 

AssessmentID InstallationDate QuarterlyReportType 
1 2009-08-14 1st Quarterly 
1 2009-08-14 2nd Quarterly 
1 2009-08-14 3rd Quarterly 
1 2009-08-14 4th Quarterly 
2 2008-05-16 4th Quarterly 
2 2008-05-16 3rd Quarterly 
2 2008-05-16 2nd Quarterly 
2 2008-05-16 1st Quarterly 

I LEFT OUTER versucht habe JOINS aber in Fragen leiten. Bitte beachten Sie meine unten SQL:

SELECT #QuarterlyReportsDue.InstallationDate, #QuarterlyReportsDue.QuarterlyReportType, Reports.ReportType 
FROM #QuarterlyReportsDue 
LEFT OUTER JOIN Reports ON #QuarterlyReportsDue.AssessmentID = Reports.AssessmentID 
WHERE Reports.ReportType IN ('1st Quarterly', '2nd Quarterly', '3rd Quarterly', '4th Quarterly') 
AND Reports.ReportType <> #QuarterlyReportsDue.QuarterlyReportType 
ORDER BY #QuarterlyReportsDue.AssessmentID 

Und meine Ergebnisse:

AssessmentID QuarterlyReportType ReportType ReportID 
1 2nd Quarterly 1st Quarterly 27 
1 3rd Quarterly 1st Quarterly 27 
1 4th Quarterly 1st Quarterly 27 
2 4th Quarterly 1st Quarterly 30 
2 4th Quarterly 2nd Quarterly 31 
2 4th Quarterly 3rd Quarterly 32 
2 1st Quarterly 2nd Quarterly 31 
2 1st Quarterly 3rd Quarterly 32 
2 3rd Quarterly 1st Quarterly 30 
2 3rd Quarterly 2nd Quarterly 31 
2 2nd Quarterly 1st Quarterly 30 
2 2nd Quarterly 3rd Quarterly 32 

Zur Beurteilung 1 es funktioniert gut, Bewertung 2 viele Duplikate hat. Wie kann ich das umgehen, um nur die idealen Ergebnisse zu zeigen?

AssessmentID QuarterlyReportType ReportType 
1 2nd Quarterly 1st Quarterly 
1 3rd Quarterly 1st Quarterly 
1 4th Quarterly 1st Quarterly 
2  4th Quarterly  

Antwort

5

Wenn Sie nach links in eine Tabelle JOIN und dann eine der Spalten der betreffenden Tabelle verweisen, in der Klausel WHERE Sie die Verbindung in eine innere implizit drehen JOIN. Verschieben Sie diese Bedingungen stattdessen aus dem WHERE, und machen Sie sie zu einem Teil der JOIN-Bedingungen.

SELECT q.InstallationDate, q.QuarterlyReportType, Reports.ReportType 
    FROM #QuarterlyReportsDue q 
     LEFT OUTER JOIN Reports r 
      ON q.AssessmentID = r.AssessmentID 
       AND q.QuarterlyReportType = r.ReportType 
       AND r.ReportType IN ('1st Quarterly', '2nd Quarterly', '3rd Quarterly', '4th Quarterly') 
    WHERE r.AssessmentID IS NULL /* matching record not found in Reports table */ 
    ORDER BY #QuarterlyReportsDue.AssessmentID 
+0

Funktioniert auch gut! Danke für die Erklärung. –

3

sollten Sie NOT EXISTS verwenden, um Einträge in der temporären Tabelle zu finden, die Einträge in der vorgelegten Berichten Tabelle hat nicht übereinstimmen.

+0

+1 für die Erwähnung NICHT VORHANDEN. – Aliostad

2

Diese Verknüpfung multipliziert die Datensätze aus zwei Tabellen (Cartesian), und deshalb erhalten Sie mehr Datensätze zurück.

Denken Sie daran, Sie sind auf AssessmentId beitreten und es gibt mehrere Datensätze mit der gleichen assessmentId. Sie filtern zwar diejenigen heraus, die nicht den gleichen ReportType haben, aber Sie stoßen auf neue Kombinationen.

SELECT #QuarterlyReportsDue.InstallationDate, 
     #QuarterlyReportsDue.QuarterlyReportType 
FROM #QuarterlyReportsDue 
WHERE NOT EXISTS 
     (
     SELECT 1 
     FROM Reports 
     WHERE Reports.ReportType = QuarterlyReportsDue.QuarterlyReportType 
     AND #QuarterlyReportsDue.AssessmentID = Reports.AssessmentID 
    ) 
2

So etwas vielleicht?

SELECT  qrd.InstallationDate, 
      qrd.QuarterlyReportType 
FROM  #QuarterlyReportsDue qrd 
WHERE  qrd.QuarterlyReportType IN ('1st Quarterly', '2nd Quarterly', '3rd Quarterly', '4th Quarterly') 
      AND NOT EXISTS (
       SELECT 1 
       FROM  Reports r 
       WHERE r.AssessmentID = qrd.AssessmentID 
          AND r.ReportType = qrd.QuarterlyReportType 
      ) 
ORDER BY qrd.AssessmentID 
+0

Funktioniert perfekt. Vielen Dank! –

0
select * 
from Reports r 
left join #QuarterlyReportsDue d 
    on d.AssessmentID=r.AssessmentID 
    and d.QuarterlyReportType=ReportType 
where d.AssessmentID is null 
Verwandte Themen