sql >> Databáze >  >> RDS >> Sqlserver

Jak odstraním duplicitní řádky ze zobrazení?

DISTINCT vám nepomůže, pokud mají řádky jiné sloupce. Je zřejmé, že jedna z tabulek, ke které se připojujete, má více řádků pro jeden řádek v jiné tabulce. Chcete-li získat jeden řádek zpět, musíte odstranit další více řádků v tabulce, ke které se připojujete.

Nejjednodušší způsob, jak toho dosáhnout, je vylepšit omezení klauzule where nebo JOIN tak, aby se připojilo pouze k jedinému záznamu, který byste chtěli. Obvykle to vyžaduje stanovení pravidla, které vždy vybere 'správný' záznam z druhé tabulky.

Předpokládejme, že máte jednoduchý problém, jako je tento:

Person:  Jane
Pets: Cat, Dog

Pokud zde vytvoříte jednoduché spojení, obdržíte dva záznamy pro Jane:

Jane|Cat
Jane|Dog

To je zcela správné, pokud je vaším cílem vyjmenovat všechny kombinace lidí a domácích zvířat. Pokud však váš pohled měl místo toho uvádět seznam lidí s domácími mazlíčky nebo seznam lidí a zobrazovat jednoho z jejich mazlíčků, narazili jste na problém, který nyní máte. K tomu potřebujete pravidlo.

SELECT Person.Name, Pets.Name
FROM Person
  LEFT JOIN Pets pets1 ON pets1.PersonID = Person.ID
WHERE 0 = (SELECT COUNT(pets2.ID) 
             FROM Pets pets2
             WHERE pets2.PersonID = pets1.PersonID
                AND pets2.ID < pets1.ID);

Co to udělá, je aplikovat pravidlo, které omezí záznam Pets ve spojení na mazlíčka s nejnižším ID (první v tabulce Pets). Klauzule WHERE v podstatě říká „kde nejsou žádná domácí zvířata patřící stejné osobě s nižší hodnotou ID).

Výsledkem by byl jeden záznam:

Jane|Cat

Pravidlo, které budete muset použít na svůj výběr, bude záviset na datech ve sloupcích, které máte, a na tom, které z „více“ záznamů by se měly ve sloupci zobrazit. To však skončí skrytím některých dat, což nemusí být to, co chcete. Například výše uvedené pravidlo skrývá skutečnost, že Jane má psa. Vypadá to, jako by Jane měla pouze kočku, i když to není správné.

Pokud začínáte filtrovat platná data, možná budete muset přehodnotit obsah svého pohledu a toho, čeho se svým pohledem snažíte dosáhnout.



  1. ERROR 1524 (HY000):Plugin 'unix_socket' není načten - Laragon

  2. mysql - hledání časového razítka podle hodiny dne

  3. Použití JDeveloper s databází MySQL a databází Oracle na AWS RDS, část 1

  4. Jak se mám vypořádat s nulovými parametry v uložené proceduře PL/SQL, když je chci použít při porovnávání?