powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / как сохранить результат OUTER JOIN в таблицу?
17 сообщений из 17, страница 1 из 1
как сохранить результат OUTER JOIN в таблицу?
    #35801715
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь освоить 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 то результат отображается корректно. Подскажите плз, что я делаю неправильно?
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35804897
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А-у! Или я криво сформулировал вопрос или никто не сталкивался ? Уже весь мозг сломал.
Что поражает - переписывал запрос как UNION - результат тот-же. Если использовать запрос как источник данных для EXPORT - выгружаются все записи запроса, а вот при INSERT - сохраняется только их часть. На целевой таблице нет ни триггеров ни проверок, во все поля разрешено заносить NULL. Можно конечно обойти через два последовательных INSERTа, но как-то... неприлично.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35805882
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
askfinder,

1. Что выдаёт у вас команда db2level?
2. Вы можете воссоздать ситуацию?
Т.е. привести скрипты создания таблиц, их индексов и ключей, заполнения их конкретными данными?
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35806222
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 все показывает как надо? Где-то я не догоняю.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35806256
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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;
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35806398
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
askfinder,

Может, вы всё же приведёте пример данных, на которых это можно посмотреть?
Если не хотите - проверьте на последнем фиксе. Если и там - лажа, самый быстрый способ пофиксить это - всё равно попытаться предоставить конкретные данный, на которых можно увидеть ошибку. DDL и данные можно отдать в саппорт, чтобы он разбирался...
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35807189
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 и без него).
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35807359
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 и без него).
Нет под рукой v9.1.2, но на моей v9.1.6a ваш пример и возвращает, и вставляет по 6 строк.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35807502
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Упс! Проверил еще раз. Выяснил вот что: оказывается если этот запрос выполнять в GUI (причем таким образом, чтобы результаты отображались в ControlCenter на соответствующей вкладке), то там отображается именно 8 строк (во всяком случае на моей инсталляции DB2). Если же выполнить в консоли (или в том же GUI, но добавить хотя бы COMMIT чтобы результат выводился не на отдельной вкладке а в редакторе в тестовом виде), то отображается 6 строк. Оказывается не все йогурты... это несколько ошарашивает. В любом случае, большое спасибо Марк, я бы еще долго репу чесал!
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35807739
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
askfinderУпс! Проверил еще раз. Выяснил вот что: оказывается если этот запрос выполнять в GUI (причем таким образом, чтобы результаты отображались в ControlCenter на соответствующей вкладке), то там отображается именно 8 строк (во всяком случае на моей инсталляции DB2). Если же выполнить в консоли (или в том же GUI, но добавить хотя бы COMMIT чтобы результат выводился не на отдельной вкладке а в редакторе в тестовом виде), то отображается 6 строк. Оказывается не все йогурты... это несколько ошарашивает.У меня то же самое. Прикольно :))
Я с какого-то момента перестал этим табличным редактором пользоваться из-за его, скажем так, некоторого своеобразия...
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35809597
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

К сожалению, это еще не все. :(
Попробуйте теперь использовать этот SELECT в команде EXPORT. Что бы Вы думали? Опять 8 строк! Получается табличный редактор тут не при делах, а "гонит" именно SELECT? Что происходит?
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35809785
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 прилично.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35809873
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
askfinderК сожалению, это еще не все. :(
Попробуйте теперь использовать этот SELECT в команде EXPORT. Что бы Вы думали? Опять 8 строк! Получается табличный редактор тут не при делах, а "гонит" именно SELECT? Что происходит?Похоже, что это глюк в утилите export - она действительно экспортирует неправильное кол-во строк - 8.
Сам select и insert select возвращают правильное кол-во строк - 6.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35809975
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 это дейстаительно разные пакеты.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35810082
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, а если выполняем там же и тоже самое но добавим еще хоть одну команду (не важно какую!) - то тут уже совершенно другие опции? Такого финта я никак не ожидал.
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35810388
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
как сохранить результат OUTER JOIN в таблицу?
    #35810411
askfinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Похоже на то. Еще раз спасибо. Полагаю, на этом можно закрыть ветку.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / как сохранить результат OUTER JOIN в таблицу?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]