Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
Пытаюсь освоить DB2. По-сути, хочу занести в таблицу результат RIGHT JOIN в таблицу. Делаю так: INSERT INTO USRSCHEMA.NEWTABLE (F_ID,F_LASTNAME,F_FIRSTNAME, F_SECONDNAME,F_DATE_BIRTH, F_SER,F_NUM,F_SMO,F_SMO_NAME) SELECT T4.F_ID,T4.F_LASTNAME,T4.F_FIRSTNAME, T4.F_SECONDNAME,T4.F_DATE_BIRTH, COALESCE(T1_SERIES,'?'),COALESCE(T1_NUMBER,0), CCOALESCE(T3_ID,0),COALESCE(T3_NAME,'?') FROM (USRSCHEMA.TABLE1 AS T1 JOIN USRSCHEMA.TABLE2 AS T2 ON T1.FRGKEY=T2.PRMKEY JOIN USRSCHEMA.TABLE3 AS T3 ON T3.PRMKEY=T2.FRGKEY) RIGHT JOIN (USRSCHEMA.TABLE4 AS T4 JOIN USRSCHEMA.TABLE4 AS T5 ON T4.F_ID!=T5.F_ID AND (T4.F_LASTNAME=T5.F_LASTNAME AND T4.F_FIRSTNAME=T5.F_FIRSTNAME AND T4.F_SECONDNAME=T5.F_SECONDNAME) OR T4.F_ID=T5.F_ID AND T4.F_DATE_BIRTH IS NULL) ON T4.F_ID=T1.T1_F_ID; В результате в NEWTABLE не попадают строки из Т4, для которых нет связанных записей в остальных таблицах (т.е. как будто имеем INNER JOIN). При этом, если выполнить отдельно только SELECT то результат отображается корректно. Подскажите плз, что я делаю неправильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 13:42 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
А-у! Или я криво сформулировал вопрос или никто не сталкивался ? Уже весь мозг сломал. Что поражает - переписывал запрос как UNION - результат тот-же. Если использовать запрос как источник данных для EXPORT - выгружаются все записи запроса, а вот при INSERT - сохраняется только их часть. На целевой таблице нет ни триггеров ни проверок, во все поля разрешено заносить NULL. Можно конечно обойти через два последовательных INSERTа, но как-то... неприлично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 09:14 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinder, 1. Что выдаёт у вас команда db2level? 2. Вы можете воссоздать ситуацию? Т.е. привести скрипты создания таблиц, их индексов и ключей, заполнения их конкретными данными? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 14:56 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, db2level: DB21085I Экземпляр "DB2" использует "32" бит и выпуск DB2 "SQL09012" с идентификатором уровня "01030107". Информационные элементы суть "DB2 v9.1.200.166", "special_17369", "WR21380_17369", а также пакет FixPack "2". Продукт установлен в "D:\IBM\DB2", имя копии DB2 - "DB2DEFAULT". структура таблиц (чтобы не загромождать,указал не все поля - только те, что участвуют в запросе): CREATE TABLE USRSCHEMA.PEOPLE ( PEO_ID BIGINT NOT NULL, PEO_FIRSTNAME VARCHAR(30) NOT NULL, PEO_SECONDNAME VARCHAR(30), PEO_LASTNAME VARCHAR(50) NOT NULL, PEO_SEX CHAR(1) NOT NULL, PEO_DATE_BIRTH DATE NOT NULL, PEO_DOC_SERIES VARCHAR(20), PEO_DOC_NUMBER VARCHAR(20) NOT NULL, PEO_ADR_ID BIGINT NOT NULL, PEO_ADR_TEXT VARCHAR(250)) IN TBLSPACE INDEX IN IDXSPACE; CREATE TABLE USRSCHEMA.SMO ( SMO_ID BIGINT NOT NULL, SMO_NAME VARCHAR(200) NOT NULL, SMO_SHORTNAME VARCHAR(100) DEFAULT 'НАИМЕНОВАНИЕ СМО' NOT NULL, SMO_ADR_TEXT VARCHAR(250), SMO_OPR_ID BIGINT NOT NULL) IN TBLSPACE INDEX IN IDXSPACE; CREATE TABLE USRSCHEMA.CONTRACTS ( CON_ID BIGINT NOT NULL, CON_SMO_ID BIGINT NOT NULL, CON_ORG_ID BIGINT NOT NULL, CON_NUMBER VARCHAR(20) NOT NULL, CON_SERIES VARCHAR(20), CON_DATE DATE NOT NULL, CON_DATE_BEGIN DATE NOT NULL, CON_DATE_END DATE) IN TBLSPACE INDEX IN IDXSPACE; CREATE TABLE USRSCHEMA.POLICIES ( POL_ID BIGINT NOT NULL, POL_PEO_ID BIGINT NOT NULL, POL_CON_ID BIGINT NOT NULL, POL_SERIES VARCHAR(16) NOT NULL, POL_NUMBER BIGINT NOT NULL, POL_DATE_BEGIN DATE NOT NULL, POL_DATE_END DATE) IN TBLSPACE INDEX IN IDXSPACE; CREATE TABLE USRSCHEMA.PEO_WARN ( PEO_ID BIGINT NOT NULL, PEO_FIRSTNAME VARCHAR(30), PEO_SECONDNAME VARCHAR(30), PEO_LASTNAME VARCHAR(50), PEO_SEX CHAR(1) NOT NULL, PEO_DATE_BIRTH DATE, PEO_DOC_SERIES VARCHAR(20), PEO_DOC_NUMBER VARCHAR(20), PEO_POL_SER VARCHAR(16), PEO_POL_NUM BIGINT, PEO_SMO_ID BIGINT PEO_SMO_NAME VARCHAR(100), PEO_ADR_TEXT VARCHAR(250)) IN TBLSPACE INDEX IN IDXSPACE; ALTER TABLE USRSCHEMA.PEOPLE ADD CONSTRAINT PK_PEOPLE PRIMARY KEY (PEO_ID); ALTER TABLE USRSCHEMA.SMO ADD CONSTRAINT PK_SMO PRIMARY KEY (SMO_ID); ALTER TABLE USRSCHEMA.CONTRACTS ADD CONSTRAINT PK_CONTRACTS PRIMARY KEY (CON_ID); ALTER TABLE USRSCHEMA.POLICIES ADD CONSTRAINT PK_POLICIES PRIMARY KEY (POL_ID); CREATE INDEX IX_REL101 ON USRSCHEMA.POLICIES (POL_PEO_ID ASC) PCTFREE 10 ALLOW REVERSE SCANS PAGE SPLIT SYMMETRIC; ALTER TABLE USRSCHEMA.POLICIES ADD CONSTRAINT REL101 FOREIGN KEY (POL_PEO_ID) REFERENCES USRSCHEMA.PEOPLE (PEO_ID) ON UPDATE RESTRICT ON DELETE RESTRICT ENFORCED ENABLE QUERY OPTIMIZATION; CREATE INDEX IX_REL102 ON USRSCHEMA.POLICIES (POL_CON_ID ASC) PCTFREE 10 ALLOW REVERSE SCANS PAGE SPLIT SYMMETRIC; ALTER TABLE USRSCHEMA.POLICIES ADD CONSTRAINT REL102 FOREIGN KEY (POL_CON_ID) REFERENCES USRSCHEMA.CONTRACTS (CON_ID) ON UPDATE RESTRICT ON DELETE RESTRICT ENFORCED ENABLE QUERY OPTIMIZATION; CREATE INDEX IX_REL902 ON USRSCHEMA.CONTRACTS (CON_SMO_ID ASC) PCTFREE 10 ALLOW REVERSE SCANS PAGE SPLIT SYMMETRIC; ALTER TABLE USRSCHEMA.CONTRACTS ADD CONSTRAINT REL902 FOREIGN KEY (CON_SMO_ID) REFERENCES USRSCHEMA.SMO (SMO_ID) ON UPDATE RESTRICT ON DELETE RESTRICT ENFORCED ENABLE QUERY OPTIMIZATION; В PEOPLE хранятся записи как связанные с POLICIES, так и не связанные. Нужно вытащить "подозрительные" (одинаковые Ф.И.О. и год рождения, но не дата рождения + месяц и год рождения совпадают с 01-01 + одинаковые Ф.И.О. и адрес но разная дата рождения и т.п.) записи и сохранить их в PEO_WARN. Причем туда же нужно занести информацию о полисе и Страховой организации если запись из PEOPLE имеет дочернюю в POLICIES (человек имеет полис). Пытаюсь сделать одним запросом вот так: INSERT INTO USRSCHEMA.PEO_WARN (PEO_ID,PEO_LASTNAME,PEO_FIRSTNAME,PEO_SECONDNAME,PEO_SEX, PEO_DATE_BIRTH,PEO_SNILS,PEO_DOC_SERIES,PEO_DOC_NUMBER,PEO_ADR_TEXT, PEO_POL_SER,PEO_POL_NUM,PEO_SMO_ID,PEO_SMO_NAME) SELECT A.PEO_ID,A.PEO_LASTNAME,A.PEO_FIRSTNAME,A.PEO_SECONDNAME,A.PEO_SEX, A.PEO_DATE_BIRTH,A.PEO_SNILS,A.PEO_DOC_SERIES,A.PEO_DOC_NUMBER,A.PEO_ADR_TEXT, COALESCE(C.POL_SERIES,'?'),COALESCE(C.POL_NUMBER,0),COALESCE(D.CON_SMO_ID,0),COALESCE(E.SMO_SHORTNAME,'?') FROM (USRSCHEMA.POLICIES AS C INNER JOIN USRSCHEMA.CONTRACTS AS D ON C.POL_CON_ID=D.CON_ID INNER JOIN USRSCHEMA.SMO AS E ON E.SMO_ID=D.CON_SMO_ID) RIGHT OUTER JOIN (USRSCHEMA.PEOPLE AS A JOIN USRSCHEMA.PEOPLE AS B ON A.PEO_ID!=B.PEO_ID AND A.PEO_LASTNAME=B.PEO_LASTNAME AND A.PEO_FIRSTNAME=B.PEO_FIRSTNAME AND A.PEO_SECONDNAME=B.PEO_SECONDNAME AND (YEAR(A.PEO_DATE_BIRTH)=YEAR(B.PEO_DATE_BIRTH) OR YEAR(A.PEO_DATE_BIRTH)!=YEAR(B.PEO_DATE_BIRTH) AND A.PEO_ADR_ID=B.PEO_ADR_ID) OR A.PEO_ID=B.PEO_ID AND SUBSTR(CHAR(A.PEO_DATE_BIRTH),6,5)='01-01') ON C.POL_PEO_ID=A.PEO_ID; COALESCE - это уже от досады (а вдруг?) В результате, запись не имеющая дочерней в POLICIES не попадает в таблицу. Но если просто выполнить этот же запрос без INSERT - отображается весь набор записей. Попытка "запихать" SELECT в курсор не удалась - при первом FETCH ошибка NOT FOUND. Пробовал иначе: INSERT INTO USRSCHEMA.PEO_WARN (PEO_ID,PEO_LASTNAME,PEO_FIRSTNAME,PEO_SECONDNAME,PEO_SEX,PEO_DATE_BIRTH,PEO_SNILS,PEO_DOC_SERIES,PEO_DOC_NUMBER,PEO_ADR_TEXT, PEO_POL_SER,PEO_POL_NUM,PEO_SMO_ID,PEO_SMO_NAME) SELECT A.PEO_ID,A.PEO_LASTNAME,A.PEO_FIRSTNAME,A.PEO_SECONDNAME,A.PEO_SEX,A.PEO_DATE_BIRTH,A.PEO_SNILS, A.PEO_DOC_SERIES,A.PEO_DOC_NUMBER,A.PEO_ADR_TEXT, POL_SERIES,POL_NUMBER,CON_SMO_ID,SMO_SHORTNAME FROM USRSCHEMA.POLICIES AS C, USRSCHEMA.CONTRACTS AS D, USRSCHEMA.SMO AS E,USRSCHEMA.PEOPLE AS A, USRSCHEMA.PEOPLE AS B WHERE A.PEO_ID=C.POL_PEO_ID AND C.POL_CON_ID=D.CON_ID AND E.SMO_ID=D.CON_SMO_ID AND (A.PEO_ID!=B.PEO_ID AND (A.PEO_LASTNAME=B.PEO_LASTNAME AND A.PEO_FIRSTNAME=B.PEO_FIRSTNAME AND A.PEO_SECONDNAME=B.PEO_SECONDNAME AND YEAR(A.PEO_DATE_BIRTH)=YEAR(B.PEO_DATE_BIRTH) OR A.PEO_LASTNAME=B.PEO_LASTNAME AND A.PEO_FIRSTNAME=B.PEO_FIRSTNAME AND A.PEO_SECONDNAME=B.PEO_SECONDNAME AND YEAR(A.PEO_DATE_BIRTH)!=YEAR(B.PEO_DATE_BIRTH) AND A.PEO_ADR_ID=B.PEO_ADR_ID) OR (A.PEO_ID=B.PEO_ID AND SUBSTR(CHAR(A.PEO_DATE_BIRTH),6,5)='01-01')) UNION SELECT F.PEO_ID,F.PEO_LASTNAME,F.PEO_FIRSTNAME,F.PEO_SECONDNAME,F.PEO_SEX,F.PEO_DATE_BIRTH,F.PEO_SNILS, F.PEO_DOC_SERIES,F.PEO_DOC_NUMBER,F.PEO_ADR_TEXT, '???',0,0,'???' FROM USRSCHEMA.PEOPLE AS F,USRSCHEMA.POLICIES AS G WHERE F.PEO_ID!=G.POL_PEO_ID AND SUBSTR(CHAR(F.PEO_DATE_BIRTH),6,5)='01-01'; Результат аналогичен. Есть большое подозрение что где-то в запросе баг т.к. проверял на упрощенной модели (без всяких OR в условии связи) - работает нормально. Но даже если и так, то почему отдельный SELECT все показывает как надо? Где-то я не догоняю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 16:30 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinder, Извиняюсь, в структуре PEOPLE и PEO_WARN случайно стер нужное поле: PEO_SNILS VARCHAR(12) (хотя сути не меняет, но все же) т.е. CREATE TABLE USRSCHEMA.PEOPLE ( PEO_ID BIGINT NOT NULL, PEO_FIRSTNAME VARCHAR(30) NOT NULL, PEO_SECONDNAME VARCHAR(30), PEO_LASTNAME VARCHAR(50) NOT NULL, PEO_SEX CHAR(1) NOT NULL, PEO_DATE_BIRTH DATE NOT NULL, PEO_SNILS VARCHAR(12), PEO_DOC_SERIES VARCHAR(20), PEO_DOC_NUMBER VARCHAR(20) NOT NULL, PEO_ADR_ID BIGINT NOT NULL, PEO_ADR_TEXT VARCHAR(250)) IN TBLSPACE INDEX IN IDXSPACE; и CREATE TABLE USRSCHEMA.PEO_WARN ( PEO_ID BIGINT NOT NULL, PEO_FIRSTNAME VARCHAR(30), PEO_SECONDNAME VARCHAR(30), PEO_LASTNAME VARCHAR(50), PEO_SEX CHAR(1) NOT NULL, PEO_DATE_BIRTH DATE, PEO_SNILS VARCHAR(12), PEO_DOC_SERIES VARCHAR(20), PEO_DOC_NUMBER VARCHAR(20), PEO_POL_SER VARCHAR(16), PEO_POL_NUM BIGINT, PEO_SMO_ID BIGINT PEO_SMO_NAME VARCHAR(100), PEO_ADR_TEXT VARCHAR(250)) IN TBLSPACE INDEX IN IDXSPACE; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 16:39 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinder, Может, вы всё же приведёте пример данных, на которых это можно посмотреть? Если не хотите - проверьте на последнем фиксе. Если и там - лажа, самый быстрый способ пофиксить это - всё равно попытаться предоставить конкретные данный, на которых можно увидеть ошибку. DDL и данные можно отдать в саппорт, чтобы он разбирался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 17:24 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Извините за задержку - разница в часовых поясах. У меня версия DB2Express-C 9.1.2 под винду (халявная), вариант с FIXами не превратится в танцы с бубном? Из-за наличия связей с другими таблицами и количества полей мне нужно было либо выложить всю структуру БД (сомневаюсь что это кому-то интересно да и мало что даст), либо выложить измененный упрощенный вариант, отображающий суть проблемы (что я и пытаюсь сделать). Вот проверенный мной вариант с имеющейся проблемой: CREATE TABLE USRSCHEMA.PEOPLE ( PEO_ID BIGINT NOT NULL , PEO_FIRSTNAME VARCHAR(30) NOT NULL , PEO_SECONDNAME VARCHAR(30) , PEO_LASTNAME VARCHAR(50) NOT NULL , PEO_SEX CHAR(1) NOT NULL , PEO_DATE_BIRTH DATE NOT NULL , PEO_SNILS VARCHAR(12) , PEO_DOC_SERIES VARCHAR(20) , PEO_DOC_NUMBER VARCHAR(20) NOT NULL , PEO_ADR_ID BIGINT NOT NULL , PEO_ADR_TEXT VARCHAR(250) ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.PEO_WARN ( PEO_ID BIGINT NOT NULL , PEO_FIRSTNAME VARCHAR(30) , PEO_SECONDNAME VARCHAR(30) , PEO_LASTNAME VARCHAR(50) , PEO_SEX CHAR(1) NOT NULL , PEO_DATE_BIRTH DATE , PEO_SNILS VARCHAR(12) , PEO_DOC_SERIES VARCHAR(20) , PEO_DOC_NUMBER VARCHAR(20) , PEO_POL_SER VARCHAR(16) , PEO_POL_NUM BIGINT , PEO_SMO_ID BIGINT , PEO_SMO_NAME VARCHAR(100) , PEO_ADR_TEXT VARCHAR(250) ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.CONTRACTS ( CON_ID BIGINT NOT NULL , CON_SMO_ID BIGINT NOT NULL , CON_ORG_ID BIGINT NOT NULL , CON_NUMBER VARCHAR(20) NOT NULL , CON_SERIES VARCHAR(20) , CON_DATE DATE NOT NULL , CON_DATE_BEGIN DATE NOT NULL , CON_DATE_END DATE ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.POLICIES ( POL_ID BIGINT NOT NULL , POL_PEO_ID BIGINT NOT NULL , POL_CON_ID BIGINT NOT NULL , POL_SERIES VARCHAR(16) NOT NULL , POL_NUMBER BIGINT NOT NULL , POL_DATE_BEGIN DATE NOT NULL , POL_DATE_END DATE ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.SMO ( SMO_ID BIGINT NOT NULL , SMO_NAME VARCHAR(200) NOT NULL , SMO_SHORTNAME VARCHAR(100) NOT NULL WITH DEFAULT 'НАИМЕНОВАНИЕ СМО' , SMO_ADR_TEXT VARCHAR(250) ) IN USERSPACE1 ; COMMIT; INSERT INTO USRSCHEMA.PEOPLE VALUES (1,'ВАСИЛИЙ','ВАСИЛЬЕВИЧ','ПУПКИН','М','1995-01-01','12345678','111222','123456',1,'АДРЕС 1'), (2,'ВАСИЛИЙ','ВАСИЛЬЕВИЧ','ПУПКИН','М','1996-02-03','12345678','111222','123456',1,'АДРЕС 1'), (3,'ВАСИЛИЙ','ПЕТРОВИЧ','ПУПКИН','М','1996-01-01','12345678','111222','123456',2,'АДРЕС 2'), (4,'ИВАН','ИВАНОВИЧ','ИВАНОВ','М','1980-12-12','12345678','111222','123456',3,'АДРЕС 3'), (5,'ПЕТР','ПЕТРОВИЧ','ПЕТРОВ','М','1991-05-05','12345678','111222','123456',1,'АДРЕС 1'), (6,'ВАСИЛИЙ','ВАСИЛЬЕВИЧ','ПУПКИН','М','1996-02-03','12345678','111222','123456',2,'АДРЕС 2'), (7,'ИВАН','ИВАНОВИЧ','ИВАНОВ','М','1980-10-10','12345678','111222','123456',3,'АДРЕС 3'); INSERT INTO USRSCHEMA.SMO VALUES (1,'СМО 1','СМО 1','АДРЕС 1'); INSERT INTO USRSCHEMA.CONTRACTS VALUES (1,1,1,'001','СЕРИЯ_1','2008-12-31','2009-01-01','2009-12-31'); INSERT INTO USRSCHEMA.POLICIES VALUES (1,1,1,'СЕРИЯ_1',1,'2008-01-01','2009-06-30'), (2,2,1,'СЕРИЯ_1',2,'2008-01-01','2009-06-30'), (3,3,1,'СЕРИЯ_1',3,'2008-01-01','2009-06-30'), (4,4,1,'СЕРИЯ_1',4,'2008-01-01','2009-06-30'), (5,5,1,'СЕРИЯ_1',5,'2008-01-01','2009-06-30'); COMMIT; Вот запрос, которым я пытаюсь сделать INSERT: INSERT INTO USRSCHEMA.PEO_WARN (PEO_ID,PEO_LASTNAME,PEO_FIRSTNAME,PEO_SECONDNAME,PEO_SEX, PEO_DATE_BIRTH,PEO_SNILS,PEO_DOC_SERIES,PEO_DOC_NUMBER,PEO_ADR_TEXT, PEO_POL_SER,PEO_POL_NUM,PEO_SMO_ID,PEO_SMO_NAME) SELECT A.PEO_ID,A.PEO_LASTNAME,A.PEO_FIRSTNAME,A.PEO_SECONDNAME,A.PEO_SEX, A.PEO_DATE_BIRTH,A.PEO_SNILS,A.PEO_DOC_SERIES,A.PEO_DOC_NUMBER,A.PEO_ADR_TEXT, COALESCE(C.POL_SERIES,'?'),COALESCE(C.POL_NUMBER,0),COALESCE(D.CON_SMO_ID,0),COALESCE(E.SMO_SHORTNAME,'?') FROM (USRSCHEMA.POLICIES AS C INNER JOIN USRSCHEMA.CONTRACTS AS D ON C.POL_CON_ID=D.CON_ID INNER JOIN USRSCHEMA.SMO AS E ON E.SMO_ID=D.CON_SMO_ID) RIGHT OUTER JOIN (USRSCHEMA.PEOPLE AS A JOIN USRSCHEMA.PEOPLE AS B ON A.PEO_ID!=B.PEO_ID AND A.PEO_LASTNAME=B.PEO_LASTNAME AND A.PEO_FIRSTNAME=B.PEO_FIRSTNAME AND A.PEO_SECONDNAME=B.PEO_SECONDNAME AND (YEAR(A.PEO_DATE_BIRTH)=YEAR(B.PEO_DATE_BIRTH) OR YEAR(A.PEO_DATE_BIRTH)!=YEAR(B.PEO_DATE_BIRTH) AND A.PEO_ADR_ID=B.PEO_ADR_ID) OR A.PEO_ID=B.PEO_ID AND SUBSTR(CHAR(A.PEO_DATE_BIRTH),6,5)='01-01') ON C.POL_PEO_ID=A.PEO_ID; При этом, в результирующую таблицу попадают шесть записей, а если из этого запроса выполнить только SELECT то отображаются 8 записей. Возможно причина глюка в условии связи самообъединения (не уверен что можно сочетать A.PEO_ID!=B.PEO_ID и A.PEO_ID=B.PEO_ID), но сильно сбивает с толку то, что я не вижу логики в поведении SELECT (с INSERT и без него). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 08:09 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinderMark Barinstein, Извините за задержку - разница в часовых поясах. У меня версия DB2Express-C 9.1.2 под винду (халявная), вариант с FIXами не превратится в танцы с бубном? Из-за наличия связей с другими таблицами и количества полей мне нужно было либо выложить всю структуру БД (сомневаюсь что это кому-то интересно да и мало что даст), либо выложить измененный упрощенный вариант, отображающий суть проблемы (что я и пытаюсь сделать). Вот проверенный мной вариант с имеющейся проблемой: CREATE TABLE USRSCHEMA.PEOPLE ( PEO_ID BIGINT NOT NULL , PEO_FIRSTNAME VARCHAR(30) NOT NULL , PEO_SECONDNAME VARCHAR(30) , PEO_LASTNAME VARCHAR(50) NOT NULL , PEO_SEX CHAR(1) NOT NULL , PEO_DATE_BIRTH DATE NOT NULL , PEO_SNILS VARCHAR(12) , PEO_DOC_SERIES VARCHAR(20) , PEO_DOC_NUMBER VARCHAR(20) NOT NULL , PEO_ADR_ID BIGINT NOT NULL , PEO_ADR_TEXT VARCHAR(250) ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.PEO_WARN ( PEO_ID BIGINT NOT NULL , PEO_FIRSTNAME VARCHAR(30) , PEO_SECONDNAME VARCHAR(30) , PEO_LASTNAME VARCHAR(50) , PEO_SEX CHAR(1) NOT NULL , PEO_DATE_BIRTH DATE , PEO_SNILS VARCHAR(12) , PEO_DOC_SERIES VARCHAR(20) , PEO_DOC_NUMBER VARCHAR(20) , PEO_POL_SER VARCHAR(16) , PEO_POL_NUM BIGINT , PEO_SMO_ID BIGINT , PEO_SMO_NAME VARCHAR(100) , PEO_ADR_TEXT VARCHAR(250) ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.CONTRACTS ( CON_ID BIGINT NOT NULL , CON_SMO_ID BIGINT NOT NULL , CON_ORG_ID BIGINT NOT NULL , CON_NUMBER VARCHAR(20) NOT NULL , CON_SERIES VARCHAR(20) , CON_DATE DATE NOT NULL , CON_DATE_BEGIN DATE NOT NULL , CON_DATE_END DATE ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.POLICIES ( POL_ID BIGINT NOT NULL , POL_PEO_ID BIGINT NOT NULL , POL_CON_ID BIGINT NOT NULL , POL_SERIES VARCHAR(16) NOT NULL , POL_NUMBER BIGINT NOT NULL , POL_DATE_BEGIN DATE NOT NULL , POL_DATE_END DATE ) IN USERSPACE1 ; CREATE TABLE USRSCHEMA.SMO ( SMO_ID BIGINT NOT NULL , SMO_NAME VARCHAR(200) NOT NULL , SMO_SHORTNAME VARCHAR(100) NOT NULL WITH DEFAULT 'НАИМЕНОВАНИЕ СМО' , SMO_ADR_TEXT VARCHAR(250) ) IN USERSPACE1 ; COMMIT; INSERT INTO USRSCHEMA.PEOPLE VALUES (1,'ВАСИЛИЙ','ВАСИЛЬЕВИЧ','ПУПКИН','М','1995-01-01','12345678','111222','123456',1,'АДРЕС 1'), (2,'ВАСИЛИЙ','ВАСИЛЬЕВИЧ','ПУПКИН','М','1996-02-03','12345678','111222','123456',1,'АДРЕС 1'), (3,'ВАСИЛИЙ','ПЕТРОВИЧ','ПУПКИН','М','1996-01-01','12345678','111222','123456',2,'АДРЕС 2'), (4,'ИВАН','ИВАНОВИЧ','ИВАНОВ','М','1980-12-12','12345678','111222','123456',3,'АДРЕС 3'), (5,'ПЕТР','ПЕТРОВИЧ','ПЕТРОВ','М','1991-05-05','12345678','111222','123456',1,'АДРЕС 1'), (6,'ВАСИЛИЙ','ВАСИЛЬЕВИЧ','ПУПКИН','М','1996-02-03','12345678','111222','123456',2,'АДРЕС 2'), (7,'ИВАН','ИВАНОВИЧ','ИВАНОВ','М','1980-10-10','12345678','111222','123456',3,'АДРЕС 3'); INSERT INTO USRSCHEMA.SMO VALUES (1,'СМО 1','СМО 1','АДРЕС 1'); INSERT INTO USRSCHEMA.CONTRACTS VALUES (1,1,1,'001','СЕРИЯ_1','2008-12-31','2009-01-01','2009-12-31'); INSERT INTO USRSCHEMA.POLICIES VALUES (1,1,1,'СЕРИЯ_1',1,'2008-01-01','2009-06-30'), (2,2,1,'СЕРИЯ_1',2,'2008-01-01','2009-06-30'), (3,3,1,'СЕРИЯ_1',3,'2008-01-01','2009-06-30'), (4,4,1,'СЕРИЯ_1',4,'2008-01-01','2009-06-30'), (5,5,1,'СЕРИЯ_1',5,'2008-01-01','2009-06-30'); COMMIT; Вот запрос, которым я пытаюсь сделать INSERT: INSERT INTO USRSCHEMA.PEO_WARN (PEO_ID,PEO_LASTNAME,PEO_FIRSTNAME,PEO_SECONDNAME,PEO_SEX, PEO_DATE_BIRTH,PEO_SNILS,PEO_DOC_SERIES,PEO_DOC_NUMBER,PEO_ADR_TEXT, PEO_POL_SER,PEO_POL_NUM,PEO_SMO_ID,PEO_SMO_NAME) SELECT A.PEO_ID,A.PEO_LASTNAME,A.PEO_FIRSTNAME,A.PEO_SECONDNAME,A.PEO_SEX, A.PEO_DATE_BIRTH,A.PEO_SNILS,A.PEO_DOC_SERIES,A.PEO_DOC_NUMBER,A.PEO_ADR_TEXT, COALESCE(C.POL_SERIES,'?'),COALESCE(C.POL_NUMBER,0),COALESCE(D.CON_SMO_ID,0),COALESCE(E.SMO_SHORTNAME,'?') FROM (USRSCHEMA.POLICIES AS C INNER JOIN USRSCHEMA.CONTRACTS AS D ON C.POL_CON_ID=D.CON_ID INNER JOIN USRSCHEMA.SMO AS E ON E.SMO_ID=D.CON_SMO_ID) RIGHT OUTER JOIN (USRSCHEMA.PEOPLE AS A JOIN USRSCHEMA.PEOPLE AS B ON A.PEO_ID!=B.PEO_ID AND A.PEO_LASTNAME=B.PEO_LASTNAME AND A.PEO_FIRSTNAME=B.PEO_FIRSTNAME AND A.PEO_SECONDNAME=B.PEO_SECONDNAME AND (YEAR(A.PEO_DATE_BIRTH)=YEAR(B.PEO_DATE_BIRTH) OR YEAR(A.PEO_DATE_BIRTH)!=YEAR(B.PEO_DATE_BIRTH) AND A.PEO_ADR_ID=B.PEO_ADR_ID) OR A.PEO_ID=B.PEO_ID AND SUBSTR(CHAR(A.PEO_DATE_BIRTH),6,5)='01-01') ON C.POL_PEO_ID=A.PEO_ID; При этом, в результирующую таблицу попадают шесть записей, а если из этого запроса выполнить только SELECT то отображаются 8 записей. Возможно причина глюка в условии связи самообъединения (не уверен что можно сочетать A.PEO_ID!=B.PEO_ID и A.PEO_ID=B.PEO_ID), но сильно сбивает с толку то, что я не вижу логики в поведении SELECT (с INSERT и без него). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 10:14 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Упс! Проверил еще раз. Выяснил вот что: оказывается если этот запрос выполнять в GUI (причем таким образом, чтобы результаты отображались в ControlCenter на соответствующей вкладке), то там отображается именно 8 строк (во всяком случае на моей инсталляции DB2). Если же выполнить в консоли (или в том же GUI, но добавить хотя бы COMMIT чтобы результат выводился не на отдельной вкладке а в редакторе в тестовом виде), то отображается 6 строк. Оказывается не все йогурты... это несколько ошарашивает. В любом случае, большое спасибо Марк, я бы еще долго репу чесал! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 10:57 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinderУпс! Проверил еще раз. Выяснил вот что: оказывается если этот запрос выполнять в GUI (причем таким образом, чтобы результаты отображались в ControlCenter на соответствующей вкладке), то там отображается именно 8 строк (во всяком случае на моей инсталляции DB2). Если же выполнить в консоли (или в том же GUI, но добавить хотя бы COMMIT чтобы результат выводился не на отдельной вкладке а в редакторе в тестовом виде), то отображается 6 строк. Оказывается не все йогурты... это несколько ошарашивает.У меня то же самое. Прикольно :)) Я с какого-то момента перестал этим табличным редактором пользоваться из-за его, скажем так, некоторого своеобразия... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 12:12 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, К сожалению, это еще не все. :( Попробуйте теперь использовать этот SELECT в команде EXPORT. Что бы Вы думали? Опять 8 строк! Получается табличный редактор тут не при делах, а "гонит" именно SELECT? Что происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 06:40 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinder, Вроде бы нашел (не без сторонней помощи)! Баг в обработке моего конкретного запроса (не зря я на него волком смотрел!). А именно - в условии SUBSTR(CHAR(A.PEO_DATE_BIRTH),6,5)='01-01'. По пока неизвестной мне причине редактор SQL в GUI различным образом обрабатывает тип данных ДАТА. Т.е. если вывод идет во фрейм SQL-редактора в текстовом виде то (такое впечатление) используются один формат преобразования ДАТА в CHAR, если же вывод идет в табличный редактор GUI или SELECT используется, к примеру, в команде EXPORT, то преобразование работает иначе. Во всяком случае, замена указанной конструкции на DAY(A.PEO_DATE_BIRTH)=1 AND MONTH(A.PEO_DATE_BIRTH)=1 чудесным образом заставила вести себя SELECT прилично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 09:51 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinderК сожалению, это еще не все. :( Попробуйте теперь использовать этот SELECT в команде EXPORT. Что бы Вы думали? Опять 8 строк! Получается табличный редактор тут не при делах, а "гонит" именно SELECT? Что происходит?Похоже, что это глюк в утилите export - она действительно экспортирует неправильное кол-во строк - 8. Сам select и insert select возвращают правильное кол-во строк - 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 10:28 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinderВроде бы нашел (не без сторонней помощи)! Баг в обработке моего конкретного запроса (не зря я на него волком смотрел!). А именно - в условии SUBSTR(CHAR(A.PEO_DATE_BIRTH),6,5)='01-01'. По пока неизвестной мне причине редактор SQL в GUI различным образом обрабатывает тип данных ДАТА. Т.е. если вывод идет во фрейм SQL-редактора в текстовом виде то (такое впечатление) используются один формат преобразования ДАТА в CHAR, если же вывод идет в табличный редактор GUI или SELECT используется, к примеру, в команде EXPORT, то преобразование работает иначе. Во всяком случае, замена указанной конструкции на DAY(A.PEO_DATE_BIRTH)=1 AND MONTH(A.PEO_DATE_BIRTH)=1 чудесным образом заставила вести себя SELECT прилично.Да, правильно. Вам надо писать: SUBSTR(CHAR(A.PEO_DATE_BIRTH , ISO ),6,5)='01-01' т.к. CHAR(A.PEO_DATE_BIRTH) будет выдавать строку, в зависимости от опции связывания datetime, с которой был собран пакет, с помощью которого запускается команда. В случае cli и утилиты export это дейстаительно разные пакеты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 10:55 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein т.к. CHAR(A.PEO_DATE_BIRTH) будет выдавать строку, в зависимости от опции связывания datetime, с которой был собран пакет, с помощью которого запускается команда. В случае cli и утилиты export это дейстаительно разные пакеты. Если я правильно понял - при выполнении команды из редактора "в фоне" происходит формирование пакета? Но все равно не понятно в чем различие в выполнении SELECT ... FROM ... WHERE CHAR(A.PEO_DATE_BIRTH); и SELECT ... FROM ... WHERE CHAR(A.PEO_DATE_BIRTH); COMMIT; (тут вместо COMMIT может быть что угодно) при выполнении из одного и того же окна SQL-редактора. Выходит, что для выполнения одной команды формируется пакет с одними опциями DATETIME, а если выполняем там же и тоже самое но добавим еще хоть одну команду (не важно какую!) - то тут уже совершенно другие опции? Такого финта я никак не ожидал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 11:27 |
|
||
|
как сохранить результат OUTER JOIN в таблицу?
|
|||
|---|---|---|---|
|
#18+
askfinderЕсли я правильно понял - при выполнении команды из редактора "в фоне" происходит формирование пакета? Но все равно не понятно в чем различие в выполнении SELECT ... FROM ... WHERE CHAR(A.PEO_DATE_BIRTH); и SELECT ... FROM ... WHERE CHAR(A.PEO_DATE_BIRTH); COMMIT; (тут вместо COMMIT может быть что угодно) при выполнении из одного и того же окна SQL-редактора. Выходит, что для выполнения одной команды формируется пакет с одними опциями DATETIME, а если выполняем там же и тоже самое но добавим еще хоть одну команду (не важно какую!) - то тут уже совершенно другие опции? Такого финта я никак не ожидал.Нет, в фоне ничего не происходит. Выполнение каждого запроса контролируется каким-нибудь пакетом. Предполагаю, что в db2cc в зависимости от того, куда будет направлен вывод, могут использоваться разные пакеты, связанные с разными опциями datetime. Что касается export , то можете почитать там про: Usage notes ... Export packages are bound using DATETIME ISO format, thus, all date/time/timestamp values are converted into ISO format when cast to a string representation. Since the CLP packages are bound using DATETIME LOC format (locale specific format), you may see inconsistent behavior between CLP and export if the CLP DATETIME format is different from ISO. For instance, the following SELECT statement may return expected results: db2 select col2 from tab1 where char(col2)='05/10/2005'; COL2 ---------- 05/10/2005 05/10/2005 05/10/2005 3 record(s) selected. But an export command using the same select clause will not: db2 export to test.del of del select col2 from test where char(col2)='05/10/2005'; Number of rows exported: 0 Now, replacing the LOCALE date format with ISO format gives the expected results: db2 export to test.del of del select col2 from test where char(col2)='2005-05-10'; Number of rows exported: 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:35 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35806222&tid=1603424]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 355ms |

| 0 / 0 |
