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

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?

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? :)

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
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
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)
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;
0

Super, dzięki za pomoc wszystkim :)

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