Daniel Garcia, May 03, 2004 - 7:55 am UTC
Sorry for don't give you the 'create table's and the example data. As I resolve the problem using OLEDB 9.01 instead OLEDB 9.2 I thought to don't bother more and study the problem by myself when I'll have time.
Related to doing applications against different databases I'm totally agree with you but I couldn't choose.
CREATE TABLE REC (
IDRECURSO VARCHAR2 (10) NOT NULL,
NOMBRE VARCHAR2 (50) NOT NULL,
ACTIVO NUMBER (1) DEFAULT (1) ) ;
ALTER TABLE REC ADD CONSTRAINT PK_REC
UNIQUE (IDRECURSO) ;
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M01' ,'Nombre y apellido Operario A' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M03' ,'SISTEMA DE GESTIÓN INSTALACIONES' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M05' ,'GRUPO ELECTRÓGENO' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M10' ,'ASCENSOR Nº 12637 EDIFICIO B' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M11' ,'ASCENSOR Nº 12704 Y 12705 EDIFICIO C' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M12' ,'ASCENSOR Nº 12680 Y 12681 EDIFICIO B' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M13' ,'ASCENSOR Nº 12636 EDIFICIO C' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M14' ,'GÓNDOLA Nº 1752' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M02' ,'Nombre y apellidos operario C' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M04' ,'GRUPO P. CONTRA INCENDIOS, BOMBAS WILO Y CALPEDA' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M06' ,'GÓNDOLA Nº 1744' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M07' ,'EXUTORIOS Y EVACUACIÓN DE HUMOS' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M08' ,'PLANTAS ENFRIADORAS Y BOMBAS DE CALOR' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M09' ,'INSTALACIÓN DETECCIÓN Y EXTINCIÓN INCENDIOS' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M15' ,'GÓNDOLA Nº 1745' ,1);
INSERT INTO REC (IDRECURSO,NOMBRE,ACTIVO) VALUES ('M00' ,'Nombre y apellido Operario C' ,0);
CREATE TABLE EMP (
IDEMPRESA NUMBER (10) NOT NULL,
NOMBRE VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE EMP ADD CONSTRAINT PK_EMP
UNIQUE (IDEMPRESA) ;
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (7,'SDMO');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (10,'CONTROLLI TREND');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (27,'AGUILERA ELECTRÓNICA');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (47,'TALLERES NAVARRETE');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (48,'MANLIN, S.L.');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (49,'EURO SISTEMA INCENDIO, S.L.');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (50,'DIFUSORA DEL CLIMA R.R., S.L.');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (52,'KONE ELEVADORES, S.A.');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (42,'ROCKWOOL');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (43,'KAIMANNFLEX');
INSERT INTO EMP (IDEMPRESA,NOMBRE) VALUES (58,'COMPRESORES JOSVAL');
CREATE TABLE CONTR (
IDCONTRATO NUMBER (10) NOT NULL,
IDEMPRESA NUMBER (10) NOT NULL,
FECHAINICIO DATE NOT NULL,
FECHAFIN DATE NOT NULL ) ;
ALTER TABLE CONTR ADD CONSTRAINT PK_CONTR
UNIQUE (IDCONTRATO) ;
ALTER TABLE CONTR ADD CONSTRAINT FK_CONTR_EMP
FOREIGN KEY (IDEMPRESA)
REFERENCES EMP (IDEMPRESA) ;
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (1,10,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (2,47,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (3,7,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (4,47,to_date('01/01/2005','dd-mm-yyyy'),to_date('31/12/2006','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (5,48,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (6,49,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (7,50,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/07/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (8,50,to_date('01/08/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (9,50,to_date('01/01/2005','dd-mm-yyyy'),to_date('31/12/2005','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (10,27,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (11,52,to_date('01/07/2003','dd-mm-yyyy'),to_date('30/06/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (12,52,to_date('01/07/2003','dd-mm-yyyy'),to_date('30/06/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (13,52,to_date('10/07/2003','dd-mm-yyyy'),to_date('09/07/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (14,52,to_date('01/07/2003','dd-mm-yyyy'),to_date('30/06/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (17,48,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
INSERT INTO CONTR (IDCONTRATO,IDEMPRESA,FECHAINICIO,FECHAFIN) VALUES (18,48,to_date('01/01/2004','dd-mm-yyyy'),to_date('31/12/2004','dd-mm-yyyy'));
CREATE TABLE CONTR_REC (
IDCONTRATO NUMBER (10) NOT NULL,
IDRECURSO VARCHAR2 (10) NOT NULL ) ;
ALTER TABLE CONTR_REC ADD CONSTRAINT PK_CONTR_REC
UNIQUE (IDCONTRATO, IDRECURSO) ;
ALTER TABLE CONTR_REC ADD CONSTRAINT FK_CONTR_REC_CONTR
FOREIGN KEY (IDCONTRATO)
REFERENCES CONTR (IDCONTRATO) ;
ALTER TABLE CONTR_REC ADD CONSTRAINT FK_CONTR_REC_REC
FOREIGN KEY (IDRECURSO)
REFERENCES REC (IDRECURSO) ;
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (1,'M03');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (2,'M04');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (3,'M05');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (5,'M06');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (6,'M07');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (7,'M08');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (8,'M08');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (9,'M08');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (10,'M09');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (11,'M10');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (12,'M11');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (13,'M12');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (14,'M13');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (17,'M14');
INSERT INTO CONTR_REC (IDCONTRATO,IDRECURSO) VALUES (18,'M15');
The original select statement (whith the results I want):
select REC.*,(select e0.nombre from EMP e0,CONTR c0,CONTR_REC
cr0,REC r0 where c0.idempresa = e0.idempresa And c0.idcontrato =
cr0.idcontrato And cr0.idRecurso = r0.idRecurso And
r0.idrecurso=REC.idrecurso and c0.fechainicio <=
to_date('30/4/2004','dd-mm-yyyy') AND c0.fechafin >=
to_date('30/4/2004','dd-mm-yyyy')) as nomempresa from REC where
REC.activo=1 order by REC.idrecurso
IDRECURSO NOMBRE ACTIVO NOMEMPRESA
M01 Nombre y apellido Operario A 1
M02 Nombre y apellidos operario B 1
M03 SISTEMA DE GESTIÓN INSTALACIONES 1 CONTROLLI TREND
M04 GRUPO P. CONTRA INCENDIOS, BOMBAS WILO Y CALPEDA 1 TALLERES NAVARRETE
M05 GRUPO ELECTRÓGENO 1 SDMO
M06 GÓNDOLA Nº 1744 1 MANLIN, S.L.
M07 EXUTORIOS Y EVACUACIÓN DE HUMOS 1 EURO SISTEMA INCENDIO, S.L.
M08 PLANTAS ENFRIADORAS Y BOMBAS DE CALOR 1 DIFUSORA DEL CLIMA R.R., S.L.
M09 INSTALACIÓN DETECCIÓN Y EXTINCIÓN INCENDIOS 1 AGUILERA ELECTRÓNICA
M10 ASCENSOR Nº 12637 EDIFICIO B 1 KONE ELEVADORES, S.A.
M11 ASCENSOR Nº 12704 Y 12705 EDIFICIO C 1 KONE ELEVADORES, S.A.
M12 ASCENSOR Nº 12680 Y 12681 EDIFICIO B 1 KONE ELEVADORES, S.A.
M13 ASCENSOR Nº 12636 EDIFICIO C 1 KONE ELEVADORES, S.A.
M14 GÓNDOLA Nº 1752 1 MANLIN, S.L.
M15 GÓNDOLA Nº 1745 1 MANLIN, S.L.
The select statement I tried (with too many rows returned, 'M08' is repeated):
select r0.*, e0.nombre as nomempresa from REC r0, CONTR_REC cr0,
CONTR c0, EMP e0 where r0.activo = 1 and r0.IDRECURSO = cr0.IDRECURSO (+)
And cr0.idcontrato = c0.idcontrato (+) and c0.idempresa = e0.idempresa (+) And
c0.fechainicio (+) <= to_date ('29/4/2004','dd-mm-yyyy') AND c0.fechafin (+) >=
to_date ('29/4/2004','dd-mm-yyyy') order by R0.idrecurso
IDRECURSO NOMBRE ACTIVO NOMEMPRESA
M01 Nombre y apellido Operario A 1
M02 Nombre y apellidos operario B 1
M03 SISTEMA DE GESTIÓN INSTALACIONES 1 CONTROLLI TREND
M04 GRUPO P. CONTRA INCENDIOS, BOMBAS WILO Y CALPEDA 1 TALLERES NAVARRETE
M05 GRUPO ELECTRÓGENO 1 SDMO
M06 GÓNDOLA Nº 1744 1 MANLIN, S.L.
M07 EXUTORIOS Y EVACUACIÓN DE HUMOS 1 EURO SISTEMA INCENDIO, S.L.
M08 PLANTAS ENFRIADORAS Y BOMBAS DE CALOR 1 DIFUSORA DEL CLIMA R.R., S.L.
M08 PLANTAS ENFRIADORAS Y BOMBAS DE CALOR 1
M08 PLANTAS ENFRIADORAS Y BOMBAS DE CALOR 1
M09 INSTALACIÓN DETECCIÓN Y EXTINCIÓN INCENDIOS 1 AGUILERA ELECTRÓNICA
M10 ASCENSOR Nº 12637 EDIFICIO B 1 KONE ELEVADORES, S.A.
M11 ASCENSOR Nº 12704 Y 12705 EDIFICIO C 1 KONE ELEVADORES, S.A.
M12 ASCENSOR Nº 12680 Y 12681 EDIFICIO B 1 KONE ELEVADORES, S.A.
M13 ASCENSOR Nº 12636 EDIFICIO C 1 KONE ELEVADORES, S.A.
M14 GÓNDOLA Nº 1752 1 MANLIN, S.L.
M15 GÓNDOLA Nº 1745 1 MANLIN, S.L.
May 03, 2004 - 8:25 am UTC
I'll have to recommend a VIEW with the scalar subquery. In that fashion, you'll have one piece of code that works "ok" for both databases.
Without using advanced sql features that sqlserver does not have (analytic functions in particular), I do not see an efficient method of doing this in a generic fashion.