2016-04-27 4 views
2

I have read this articleGet duplicates wirklich ist es eine schlechte Abfrage oder schlechte Datenbank-Design?

Im zweiten paragrpah sagt dies:

„Die Tatsache, dass das Ergebnis Duplikate häufig hat (wenn auch nicht immer) das Ergebnis eines schlechten Datenbank-Design, eine unwirksamen Abfrage oder beides“.

Später als Beispiel die Adventures-Datenbank, die ich denke, dass es ein gutes Design hat.

Nun, mein Zweifel ist dieser Fall. Ich habe Tische, Personen und Bestellungen und ich möchte alle Personen bekommen, die mindestens eine Bestellung haben, die insgesamt> = 200 € ist. Ich würde diese Abfrage verwenden:

Select Persons.* from Persons, Orders where 
Orders.IDPerson = Persons.IDPerson 
and Orders.Total >= 200; 

In diesem Fall kann ich oft die gleiche Person bekommen, weil mehr als eine Größenordnung hat, die insgesamt 200 oder mehr ist. Wirklich möchte ich jede Person einmal in den Ergebnissen, also ist diese Abfrage eine schlechte Abfrage, weil ich die gleiche Person viele Male bekommen kann?

Eine weitere Option ist diese Abfrage:

select * from Person where 
IDPerson IN(select IDPerson from Orders where total >= 200); 

In diesem Fall habe ich jede Person nur einmal bekommen, obwohl diese Person mehr als einen Auftrag mit insgesamt hat> = 200. Aber eine Unterabfrage verwenden, um Duplikate zu vermeiden in die Hauptfrage ist es eine gute Idee?

In diesem Fall, Personen und Bestellungen, schätze ich, dass das Datenbankdesign nicht schlecht ist, weil ich nicht weiß, welche andere Option ich dieses Modell zu entwerfen, und die Abfrage ist sehr einfach, aber ich habe der Zweifel, ob in diesem Fall, um Duplikate zu bekommen, es ein Zeichen der schlechten Abfrage ist.

Zusammenfassend ist Get Dubletten in diesem Fall eine schlechte Abfrage?

Danke.

+4

ist eine schlechte Praxis NICHT EINDEUTIG 'JOIN' :) Adventure Design ist ok zu verwenden. Die erste Abfrage wird wie erwartet zurückgegeben. Aber du hast eine '1: n'-Beziehung. Deshalb erhalten Sie Duplikate. Wenn Sie nur Daten von Personen wollen, können Sie 'SELECT DISTINCT Persons. *' Hinzufügen, aber die Lösung mit Unterabfrage ist etwas besser. – lad2025

+2

Die Abfrage (1) ist nicht unwirksam, aber falsch. Ihre Frage in Englisch ist: alle Personen, die mindestens eine Bestellung haben, die insgesamt> = $ 200, Ihre Frage in sql ist: alle Bestellungen mit insgesamt> = $ 200 und wer sie gekauft hat –

+0

bekommen Duplicate Wert bedeutet i) Bad DB Design ii) Schlecht Frage in dieser Reihenfolge..Ich denke, wir sollten diesen De-Normalisierungsschritt vermeiden, der zu einem doppelten Wert führt. Ich sage nicht, die Entnormalisierung insgesamt zu vermeiden. – KumarHarsh

Antwort

2

Ich denke, die erste Abfrage ist so schlecht. Scheint nicht sinnvoll, Duplikate zu erhalten, die Sie später mit DISTINCT entfernen müssen.

Die Sekundenabfrage mit der Unterabfrage scheint im Kontext nützlicher zu sein (vielleicht macht es manchmal mehr Sinn, "exists" als "in" zu verwenden).

SQL Server IN vs. EXISTS Performance

Eine solche Abfrage würde auch gut möglich sein:

select * 
from Person 
join 
(
    select IDPerson 
    from Orders 
    where total >= 200 
) PersonsWithMoreThan200Total 
on Person.IDPerson = PersonsWithMoreThan200Total.IDPerson 
Verwandte Themen