2009-06-23 23 views
2

Abfrage:MS Access SQL doppelte Zeilen?

SELECT DISTINCT ([Equipment List].ID) AS Expr1, [Job Assignments].Job 
FROM [Equipment List] LEFT JOIN [Job Assignments] 
    ON [Equipment List].ID = [Job Assignments].EquipmentID; 

In dieser Abfrage ist die Ausrüstung ID verschieden, wenn und nur wenn ich die [Job Zuweisungen] .job in der select-Anweisung nicht hinzufügen. Sobald ich das tue, bekomme ich viele Duplikate. Die Jobzuweisungstabelle hat viele Jobs, aber ich bin nur an dem interessiert, bei dem [Datum zurückgegeben] leer oder null ist. Irgendwelche Ideen, wie man das erreicht? Ich benutze dies als einen Bericht, also gibt es mir einen Fehler, wenn ich versuche, innere SQL-Abfragen zu verwenden. Dies ist auch eine vereinfachte Abfrage, da das Original mehrere Auswahlmöglichkeiten hat. Was mache ich falsch? Jede Hilfe würde sehr geschätzt werden.

Update: Ich suche nur eine Zeile aus [Job Zuweisungen] Tabelle auswählen. Irgendwelche Ideen?

Antwort

3

DISTINCT gibt eindeutige Kombinationen aller Spalten in der SELECT-Anweisung zurück, weshalb die Einführung einer zweiten Spalte auch Duples einführt.

Es klingt wie Sie mit einem wegkommen können WHERE-Klausel:

SELECT DISTINCT ([Equipment List].ID) AS Expr1, [Job Assignments].Job 
FROM [Equipment List] 
LEFT JOIN [Job Assignments] ON [Equipment List].ID = [Job Assignments].EquipmentID 
WHERE [Job Assignments].[Date Returned] IS NULL 

Sie nicht ein „leeres“ Datum haben können, wenn Sie also Rohlinge zu sehen sind dann die Chancen sind Sie nicht ein mit Datetime-Typ Ihr ​​Datum speichern - in diesem Fall müssen Sie sagen:

WHERE COALESCE([Job Assignments].[Date Returned], '') = '' 

Edit: Neueste Lösung auf Basis von Kommentaren unten:

;WITH LatestJobs 
AS 
(SELECT  ja.EquipmentID, ja.Job, 
      ROW_NUMBER() OVER (PARTITION BY EquipmentID 
           ORDER BY [Date Returned] DESC) AS RowNumber 
FROM  [Job Assignments] AS ja) 

SELECT  el.ID AS EquipmentID, 
      lj.Job 
FROM  [Equipment List] AS el 
LEFT JOIN LatestJobs AS lj ON el.ID = lj.EquipmentID 
      AND lj.RowNumber = 1 
+1

sehr gut, danke aber die [Equipment List] .ID und [Job-Zuweisungen] .EquipmentID sollte eindeutig sein. Wie würde ich das machen? Sollte die eindeutige [Geräteliste] .ID nicht nur die IDs auswählen, die in beiden Tabellen unterschiedlich sind? – Tudor

+0

Es wählt verschiedene Kombinationen von Feldern aus. Wenn Sie beispielsweise eine Zeile mit [Equipment List] .ID = 12 & [Job-Zuweisungen] .Job = 27 und einer zweiten Zeile mit denselben Werten haben, wird nur eine zurückgegeben. Hätten Sie jedoch ein drittes Ergebnis mit [Equipment List] .ID = 12 & [Job-Zuweisungen] .Job = 28, erhalten Sie zwei Zeilen - eine für Job 27 und eine für Job 28. Auch wenn die Equipment-ID war für beide Zeilen gleich, es wird immer beide Male zurückgegeben, da die COMBINATION eindeutig ist. Ist das sinnvoll? –

+1

Ja, das macht Sinn. Wie würde ich nur den neuesten Job bekommen? Ich möchte nur eine Kombination basierend auf der EquipmentID. Also für teach EquipmentID möchte ich nur eine [Job-Aufgaben] .Job – Tudor

0

Wie lauten die Datentypen der einzelnen Felder auf der Auswahl? Wenn es longchar (sql) oder Memo (in Zugriff) ist, können Sie die distinct-Funktion nicht verwenden.