Dlaczego UNION ALL nie niweluje mi automatycznie duplikatów?

0

Witam
Muszę za pomocą tabeli tymczasowych przerzucić do nowej tabeli trzy raz po 500 rekordów z innej już istniejącej.. Za każdym razem musi się pojawiać data skopiowania a później modyfikacji (bo później muszę je jeszcze edytować), Wykorzystałam do tego SELECT DISTINCT, order by NEWID z UNION ALL i wszystko mi pięknie działa ale jak dodaje do tego GETDATE () to przestaje mi pomijać duplikaty. Dlaczego? Szukam informacji w Internecie ale nie potrafię odnaleźć rozwiązania:
Działająca część kodu w przypadku drugiej tabeli tymczasowej, bo w pierwszej nie ma potrzeby UNION:

SELECT DISTINCT *
FROM            (
                         SELECT TOP (500)
                                  *
                         FROM     pro1_t_kontrahenci
                         ORDER BY Newid()
                         UNION ALL
                         SELECT *
                         FROM   #seria1) A

Część która nie pomija duplikatów po dodaniu GETDATE():

SELECT DISTINCT *
FROM            (
                         SELECT TOP (500)*, getdate() as d_ins, getdate() as d_upd
                         FROM     pro1_t_kontrahenci
                         ORDER BY Newid()
                         UNION ALL
                         SELECT *
                         FROM   #seria1) A

Dodam, że odpowiednie kolumny są utworzone i kod działa. Z tym że przestał mi pomijać duplikaty.
Bardzo dziękuję za ewentualną pomoc i stawiam wirtualną kawę :)

0

Coś chyba pomieszałeś. Zrób jeszcze raz na spokojnie te zapytania.

0
katakrowa napisał(a):

Coś chyba pomieszałeś. Zrób jeszcze raz na spokojnie te zapytania.

hmmm nie wiem co szczerze powiem bo od tygodnia nad tym siedzę-dopiero się uczę i jest to zadanie z kursu. Przesyłam cały kod może on więcej powie ;)

CREATE TABLE #seria1
             (
                          id_kontrahenta           int NOT NULL ,
                          id_kategorii_kontrahenta int NOT NULL ,
                          data_urodzin             date NULL ,
                          kontrahent               varchar (300) NULL ,
                          kod_pocztowy             varchar (50) NULL ,
                          miejscowosc              varchar (50) NULL ,
                          adres                    varchar (150) NULL ,
                          wojewodztwo              varchar (50) NULL ,
                          uzytkownik               varchar (50)NULL ,
                          email                    varchar (50)NULL ,
                          telefon                  varchar (50)NULL ,
                          rabat float NOT NULL,
						  d_ins DATETIME DEFAULT Getdate() ,
                          d_upd DATETIME DEFAULT Getdate()
             )

INSERT INTO #seria1
            (
                        id_kontrahenta,
                        id_kategorii_kontrahenta,
                        data_urodzin,
                        kontrahent,
                        kod_pocztowy,
                        miejscowosc,
                        adres,
                        wojewodztwo,
                        uzytkownik,
                        email,
                        telefon,
                        rabat
            )
SELECT TOP (500)
         *
FROM     pro1_t_kontrahenci
ORDER BY Newid()

CREATE TABLE #seria2
             (
                          id_kontrahenta           INT NOT NULL ,
                          id_kategorii_kontrahenta INT NOT NULL ,
                          data_urodzin             DATE NULL ,
                          kontrahent               VARCHAR (300) NULL ,
                          kod_pocztowy             VARCHAR (50) NULL ,
                          miejscowosc              VARCHAR (50) NULL ,
                          adres                    VARCHAR (150) NULL ,
                          wojewodztwo              VARCHAR (50) NULL ,
                          uzytkownik               VARCHAR (50)NULL ,
                          email                    VARCHAR (50)NULL ,
                          telefon                  VARCHAR (50)NULL ,
                          rabat FLOAT NOT NULL,
						  d_ins DATETIME DEFAULT Getdate() ,
                          d_upd DATETIME DEFAULT Getdate()
             )

INSERT INTO #seria2
            (
                        id_kontrahenta,
                        id_kategorii_kontrahenta,
                        data_urodzin,
                        kontrahent,
                        kod_pocztowy,
                        miejscowosc,
                        adres,
                        wojewodztwo,
                        uzytkownik,
                        email,
                        telefon,
                        rabat, d_ins, d_upd
            )
SELECT DISTINCT *
FROM            (
                         SELECT TOP (500)*, getdate() as d_ins, getdate() as d_upd
                         FROM     pro1_t_kontrahenci
                         ORDER BY Newid()
                         UNION ALL
                         SELECT *
                         FROM   #seria1) A

CREATE TABLE #seria3
             (
                          id_kontrahenta           INT NOT NULL ,
                          id_kategorii_kontrahenta INT NOT NULL ,
                          data_urodzin             DATE NULL ,
                          kontrahent               VARCHAR (300) NULL ,
                          kod_pocztowy             VARCHAR (50) NULL ,
                          miejscowosc              VARCHAR (50) NULL ,
                          adres                    VARCHAR (150) NULL ,
                          wojewodztwo              VARCHAR (50) NULL ,
                          uzytkownik               VARCHAR (50)NULL ,
                          email                    VARCHAR (50)NULL ,
                          telefon                  VARCHAR (50)NULL ,
                          rabat FLOAT NOT NULL,
                          d_ins DATETIME DEFAULT Getdate() ,
                          d_upd DATETIME DEFAULT Getdate()
             )

INSERT INTO #seria3
            (
                        id_kontrahenta,
                        id_kategorii_kontrahenta,
                        data_urodzin,
                        kontrahent,
                        kod_pocztowy,
                        miejscowosc,
                        adres,
                        wojewodztwo,
                        uzytkownik,
                        email,
                        telefon,
                        rabat,
						d_ins, d_upd
            )
SELECT DISTINCT *
FROM            (
                       SELECT *, getdate() as d_ins, getdate() as d_upd
                       FROM   pro1_t_kontrahenci
                       UNION ALL
                       SELECT *
                       FROM   #seria2) A

UPDATE #seria3
SET    kontrahent = 'Firma '+kontrahent,
       d_upd = Getdate()
WHERE  id_kategorii_kontrahenta=2SELECT *
INTO   zzz_pro1_t_kontrahenci
FROM   #seria3

SELECT   Count(*) AS Ilosc_dodanych_rekordów,
         d_ins    AS data_dodania
FROM     zzz_pro1_t_kontrahenci
GROUP BY d_ins

SELECT   Count(*) AS Ilosc_modyfikowanych_rekordow,
         d_upd    AS data_modyfikacji
FROM     zzz_pro1_t_kontrahenci
WHERE    d_upd != d_ins
GROUP BY d_upd
6

Bo getdate() za każdym razem pobiera aktualną godzinę i datę więc w kolejnej milisekundzie już będzie inne. Jeśli chcesz samą datę bez godziny to musisz zrzutować wynik na typ DATE:

CAST(GETDATE() AS DATE)

Nadal może to nie działać w skrajnych przypadkach gdy wykonasz zapytanie na przełomie zmiany daty - nie jest to najlepsze rozwiązanie żeby generować daty podczas wykonywania zapytania. Lepiej to zrobić raz przed.

Poza tym użyj UNION zamiast UNION ALL, UNION to UNION ALL + DISTINCT.

2

@DariaDasza:

Dlaczego UNION ALL nie niweluje mi automatycznie duplikatów?

Bo właśnie tak ma być, magiczne słówko "all". Nie wypowiadam się w sub-wątku "szczegółowe uwagi o polu datowym", ale nie wiem czy rozumiesz komendę.

https://dataschool.com/learn-sql/what-is-the-difference-between-union-and-union-all/

Nawiasem mówiąc "all" jest najczęściej tańsze (choć wyniku jest więcej), nie ma dodatkowego polowania na nieunikaty - bez tego polowanie tzreba zrobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1