Here is the two queries re-formatted to be more readable and comparable by humans ... and they appear as if they should both return the same result ...
However, the declared affinity of the column codcnd is INTEGER in one case and TEXT in the other. When one is doing an equijoin, one of the affinities is converted into the other, thus they match and a row is output. However, when you INTERSECT the datatypes (apparently) must be the same (that is, in the case of an equality test, the text '1' is the same as the integer 1, but in the case of the INTERSECT a text '1' is NOT the same as an INTEGER 1, hence there is no intersection and you get a null result set). Richard can answer whether this is a "bug" or not, to have the affinities expressed in one form (join) but not the other (intersect). You can "fix" by making the affinity of the codcnd column the same everywhere it occurs in the table definitions ... pragma foreign_keys = 0; CREATE TABLE cndscumplidas ( explot text, entfap text, coddto text, CODCMP text, trnid integer, tipo integer, -- el tipo de condicion. 1- prd, 2- fam, 3 - sec, 4 - pay, 5 - mfd, 6 - combo, 7 - dto aggr codprd text, -- != NULL si tipo es 1 codfam text, -- != NULL si tipo es 2 codsec text, cardmean int, cardtype int, codagg text, codcnd text, invcnd text, constraint cndscumplidas_fk foreign key (trnid) references trns(trnid) on delete cascade ); INSERT INTO cndscumplidas VALUES('111111','EEEEE','123456','1',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL); INSERT INTO cndscumplidas VALUES('111111','EEEEE','123456','2',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL); CREATE TABLE cndsinhibir ( explot text, entfap text, coddto text, CODCMP text, trnid integer, codcnd text, constraint cndsinhibir_fk foreign key (trnid) references trns(trnid) on delete cascade ); INSERT INTO cndsinhibir VALUES('111111','EEEEE','123456','3',1,'1'); INSERT INTO cndsinhibir VALUES('111111','EEEEE','123456','4',1,'1'); CREATE TABLE dtocom ( EXPLOT varchar(6), ENTFAP varchar(5), CODDTO varchar(6), CODCND text, -- ****** THIS COLUMN IS TEXT IN THE OTHER TABLES ****** TIPCMP int, CODCMP int, TSLAST date, TSLAST_T varchar(8), TSCREA date, TSCREA_T varchar(8), CONSTRAINT dtocom_pk PRIMARY KEY (EXPLOT, ENTFAP, CODDTO,CODCND, TIPCMP, CODCMP) ); INSERT INTO dtocom VALUES('111111','EEEEE','123456',1,1,1,NULL,NULL,NULL,NULL); INSERT INTO dtocom VALUES('111111','EEEEE','123456',1,1,2,NULL,NULL,NULL,NULL); INSERT INTO dtocom VALUES('111111','EEEEE','123456',1,1,3,NULL,NULL,NULL,NULL); INSERT INTO dtocom VALUES('111111','EEEEE','123456',1,1,4,NULL,NULL,NULL,NULL); CREATE TABLE trns ( trnid int primary key); INSERT INTO trns VALUES(1); select * from ( select explot, entfap, coddto, codcnd, count(coddto) from ( select explot, entfap, coddto, codcnd, codcmp from cndscumplidas where trnid = 1 union all select explot, entfap, coddto, codcnd, codcmp from cndsinhibir where trnid = 1 ) group by explot, entfap, coddto, codcnd ) intersect select * from ( select explot, entfap, coddto, codcnd, count(coddto) from dtocom group by explot, entfap, coddto, codcnd ); select * from ( select explot, entfap, coddto, codcnd, count(coddto) from ( select explot, entfap, coddto, codcnd, codcmp from cndscumplidas where trnid = 1 union all select explot, entfap, coddto, codcnd, codcmp from cndsinhibir where trnid = 1 ) group by explot, entfap, coddto, codcnd ) natural join ( select explot, entfap, coddto, codcnd, count(coddto) from dtocom group by explot, entfap, coddto, codcnd ); And the output of the two queries is ... QUERY PLAN `--COMPOUND QUERY |--LEFT-MOST SUBQUERY | |--CO-ROUTINE 3 | | |--CO-ROUTINE 2 | | | `--COMPOUND QUERY | | | |--LEFT-MOST SUBQUERY | | | | `--SCAN TABLE cndscumplidas | | | `--UNION ALL | | | `--SCAN TABLE cndsinhibir | | |--SCAN SUBQUERY 2 | | `--USE TEMP B-TREE FOR GROUP BY | `--SCAN SUBQUERY 3 `--INTERSECT USING TEMP B-TREE |--CO-ROUTINE 5 | `--SCAN TABLE dtocom USING COVERING INDEX sqlite_autoindex_dtocom_1 `--SCAN SUBQUERY 5 111111|EEEEE|123456|1|4 QUERY PLAN |--MATERIALIZE 3 | |--CO-ROUTINE 2 | | `--COMPOUND QUERY | | |--LEFT-MOST SUBQUERY | | | `--SCAN TABLE cndscumplidas | | `--UNION ALL | | `--SCAN TABLE cndsinhibir | |--SCAN SUBQUERY 2 | `--USE TEMP B-TREE FOR GROUP BY |--MATERIALIZE 4 | `--SCAN TABLE dtocom USING COVERING INDEX sqlite_autoindex_dtocom_1 |--SCAN SUBQUERY 3 `--SEARCH SUBQUERY 4 USING AUTOMATIC COVERING INDEX (count(coddto)=? AND codcnd=? AND coddto=? AND entfap=? AND explot=?) 111111|EEEEE|123456|1|4 --- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. >-----Original Message----- >From: sqlite-users [mailto:sqlite-users- >boun...@mailinglists.sqlite.org] On Behalf Of Cobo Mena, Isaac >Sent: Thursday, 6 September, 2018 04:13 >To: sqlite-users@mailinglists.sqlite.org >Cc: Gonzalez Maestre, Miguel; aesafu...@outsourcing.cepsa.com >Subject: [sqlite] Diferents values with equivalent queries. is a bug? > >Hello. > > >Using the following sql: > > >sqlite> .dump >PRAGMA foreign_keys=OFF; >BEGIN TRANSACTION; >CREATE TABLE cndscumplidas >( > explot text, > entfap text, > coddto text, > CODCMP text, > trnid integer, > tipo integer, -- el tipo de condicion. 1- prd, 2- fam, 3 - sec, 4 >- pay, 5 - mfd, 6 - combo, 7 - dto aggr > codprd text, -- != NULL si tipo es 1 > codfam text, -- != NULL si tipo es 2 > codsec text, > cardmean int, > cardtype int, > codagg text, > codcnd text, > invcnd text, > constraint cndscumplidas_fk foreign key (trnid) references >trns(trnid) on delete cascade >); >INSERT INTO cndscumplidas >VALUES('111111','EEEEE','123456','1',1,NULL,NULL,NULL,NULL,NULL,NULL, >NULL,'1',NULL); >INSERT INTO cndscumplidas >VALUES('111111','EEEEE','123456','2',1,NULL,NULL,NULL,NULL,NULL,NULL, >NULL,'1',NULL); >CREATE TABLE cndsinhibir >( > explot text, > entfap text, > coddto text, > CODCMP text, > trnid integer, > codcnd text, > constraint cndsinhibir_fk foreign key (trnid) references >trns(trnid) on delete cascade >); >INSERT INTO cndsinhibir VALUES('111111','EEEEE','123456','3',1,'1'); >INSERT INTO cndsinhibir VALUES('111111','EEEEE','123456','4',1,'1'); >CREATE TABLE dtocom ( > EXPLOT varchar(6), > ENTFAP varchar(5), > CODDTO varchar(6), > CODCND int, > TIPCMP int, > CODCMP int, > TSLAST date, > TSLAST_T varchar(8), > TSCREA date, > TSCREA_T varchar(8), > CONSTRAINT dtocom_pk PRIMARY KEY (EXPLOT, ENTFAP, CODDTO,CODCND, >TIPCMP, CODCMP) >); >INSERT INTO dtocom >VALUES('111111','EEEEE','123456',1,1,1,NULL,NULL,NULL,NULL); >INSERT INTO dtocom >VALUES('111111','EEEEE','123456',1,1,2,NULL,NULL,NULL,NULL); >INSERT INTO dtocom >VALUES('111111','EEEEE','123456',1,1,3,NULL,NULL,NULL,NULL); >INSERT INTO dtocom >VALUES('111111','EEEEE','123456',1,1,4,NULL,NULL,NULL,NULL); >CREATE TABLE trns ( trnid int primary key); >INSERT INTO trns VALUES(1); >COMMIT; > > > >I'm running the follwing selects: > > >First (no data returns): > > >select explot, entfap, coddto, codcnd, count(coddto) >from >( > select explot, entfap, coddto, codcnd, codcmp from cndscumplidas >where trnid = 1 > union all > select explot, entfap, coddto, codcnd, codcmp from cndsinhibir >where trnid = 1 > ) >group by explot, entfap, coddto, codcnd >intersect >select explot, entfap, coddto, codcnd, count(coddto) from dtocom >group by explot, entfap, coddto, codcnd; > > >Second (with registers): > > > select * from >( >select explot, entfap, coddto, codcnd, count(coddto) from dtocom >group by explot, entfap, coddto, codcnd >) a natural join ( >select explot, entfap, coddto, codcnd, count(coddto) >from >( > select explot, entfap, coddto, codcnd, codcmp from cndscumplidas >where trnid = 1 > union all > select explot, entfap, coddto, codcnd, codcmp from cndsinhibir >where trnid = 1 > ) >group by explot, entfap, coddto, codcnd) b; > > >explot entfap coddto codcnd count(coddto) >---------- ---------- ---------- ---------- ------------- >111111 EEEEE 123456 1 4 > > > >The result is not the same. I think that the queries are equivalent. >is it? > > >Thanks in advance and sorry for inconveniences. > > >Best Regards. > >Isaac Cobo. > > >________________________________ > >Este correo electrónico y, en su caso, cualquier fichero anexo al >mismo, contiene información de carácter confidencial exclusivamente >dirigida a su destinatario o destinatarios. Si no es vd. el >destinatario indicado, queda notificado que la lectura, utilización, >divulgación y/o copia sin autorización está prohibida en virtud de la >legislación vigente. En el caso de haber recibido este correo >electrónico por error, se ruega notificar inmediatamente esta >circunstancia mediante reenvío a la dirección electrónica del >remitente. >Evite imprimir este mensaje si no es estrictamente necesario. > >This email and any file attached to it (when applicable) contain(s) >confidential information that is exclusively addressed to its >recipient(s). If you are not the indicated recipient, you are >informed that reading, using, disseminating and/or copying it without >authorisation is forbidden in accordance with the legislation in >effect. If you have received this email by mistake, please >immediately notify the sender of the situation by resending it to >their email address. >Avoid printing this message if it is not absolutely necessary. >_______________________________________________ >sqlite-users mailing list >sqlite-users@mailinglists.sqlite.org >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users