[Postgresql] Porównywanie zbiorów rekordów

Odpowiedz Nowy wątek
2011-01-19 12:34
unknow666
0

Witam

Może ktoś będzie wiedział jak rozwiązać taki problem

Mamy tabele:
CREATE TABLE A
(
id serial NOT NULL,
zone integer,
code character varying(50),
....
);
CREATE TABLE B
(
id serial NOT NULL,
zone integer,
code character varying(50),
....
);

W tabeli A mamy dane np
1|111|'1'
2|111|'2'
3|111|'3'
4|222|'1'
5|333|'1'
6|333|'2'
7|444|'1'
8|555|'1'
9|666|'1'
10|666|'2'
11|666|'3'

W tabeli B mamy dane np
1|111|'1'
2|111|'2'
3|111|'3'
4|222|'2'
5|333|'1'
6|333|'3'

I teraz jak sprawdzić czy zawartość podgrupy (grupowanie po kolumnie zone) znajduje się w grupie z tabeli A

Może przykład, łatwiej będzie wytłumaczyć
Mamy podgrupę 111 B o wartościach 1,2,3, czy znajdują się one w jakiejkolwiek podgrupie tabeli A (dokładnie takie same wartości code)? W wyniku grupa 111 i 666 A.

Miałby ktoś pomysł jak stworzyć takie zapytanie, aby w wyniku były tylko numery stref A.zone,B.zone ... o identycznych zawartościach?

Pozostało 580 znaków

2011-01-19 16:34
0

z tabeli B dla odpowiedniego zone wybierasz wszystkie code
teraz z tabeli A wybierasz wszystkie rekordy ktorych code jest jednym z tych z tabeli B
robisz distinct po zone i code, grupujesz i zliczasz i wybierasz te gdzie zliczenie jest rowne licznosci code z tabeli B (uzyj klauzuli heaving)

ogarniasz? :)

Pozostało 580 znaków

2011-01-19 23:07
0

Albo np tak:


SELECT zone FROM A
WHERE array_agg(code) = (SELECT array_agg(code) FROM B WHERE A.zone = B.zone)
GROUP BY zone

da da da daaa

Pozostało 580 znaków

2011-01-20 09:36
unknow666
0
massther napisał(a)

z tabeli B dla odpowiedniego zone wybierasz wszystkie code
teraz z tabeli A wybierasz wszystkie rekordy ktorych code jest jednym z tych z tabeli B
robisz distinct po zone i code, grupujesz i zliczasz i wybierasz te gdzie zliczenie jest rowne licznosci code z tabeli B (uzyj klauzuli heaving)

ogarniasz? :)

dzieki

SELECT NUMBERZONE,COUNT(*)
    FROM MAGAZINE 
    WHERE NUMBERZONE IN (SELECT NUMBERZONE FROM MAGAZINE GROUP BY NUMBERZONE HAVING COUNT(*)=(SELECT COUNT(BARCODE) FROM MAGAZINEIMPORT WHERE NUMBERZONE=333))
    GROUP BY NUMBERZONE HAVING COUNT(*)=(SELECT COUNT(BARCODE) FROM MAGAZINEIMPORT WHERE NUMBERZONE=333)
    ; 

Mocno zakręcone wyszło, ale jak teraz to dostosować aby w wyniku bylo mi.numberzone, m.numberzone, wszystkich sprawdzeń ?

dzięki, tylko że

ERROR:  aggregates not allowed in WHERE clause
LINE 2: WHERE array_agg(barcode) = (SELECT array_agg(barcode) FROM M... 

jakaś sugestia ?

RFabianski napisał(a)

Albo np tak:

SELECT zone FROM A
WHERE array_agg(code) = (SELECT array_agg(code) FROM B WHERE A.zone = B.zone)
GROUP BY zone

Pozostało 580 znaków

2011-01-20 11:10
0

niezle, ale chyba przekombinowales :)
wystarczy tak (pisze bez mozliwosci sprawdzenia, bo nie mam pod reka zadnego systemu bazodanowego):

select NumberZone from Magazine 
where BarCode in (select BarCode from MagazineImport where NumberZone = 333)
group by NumberZone
having count(*) = (select count(*) from MagazineImport where NumberZone = 333)
edytowany 1x, ostatnio: Adam Boduch, 2011-01-20 11:14

Pozostało 580 znaków

2011-01-26 11:12
filiprem
0

SELECT codes, array_agg(distinct __A.zone) as a_zones, array_agg(distinct __B.zone) as b_zones FROM
    ( SELECT zone, array_agg(code) AS codes FROM ( SELECT * FROM A ORDER BY zone, code ) _A GROUP BY zone ) __A
    JOIN
    ( SELECT zone, array_agg(code) AS codes FROM ( SELECT * FROM B ORDER BY zone, code ) _B GROUP BY zone ) __B
    USING ( codes )
GROUP BY codes;

Pozostało 580 znaków

2011-01-28 10:40
unknow666
0

Super, dzięki za pomoc wszystkim :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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