Поддержка PostgreSQL в Корпорации 2
Итак, в качестве основной базы данных мы будем использовать - PostgreSQL. Но, при этом, все равно тестироваться и работать должно будет в MySQL и Firebird.
Поэтому, в необходимо приходить к стандартам, которые устроит как MySQL так и PostgreSQL.
Рассмотрим для примера запрос:
select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,
MK.MARKA_ID MARKA_ID,MK.VID_ID, MK.ZAV_NOMER ZAV_NOMER, MK.DVIG_NOMER DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD, MK.SER_SVID SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE, MK.DATE_UPDATE, MK.ID_REGION_KOD ID_REGION_KOD, MK.ID_RAJON ID_RAJON, MK.ID_VID, MK.ID_KOD_F, MK.NAME_ORG NAME_ORG, MK.NAME_VID NAME_VID, MK.UPPER_ZAV_NOMER, MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_
OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP from MTP_KARTA MK
left join TBLREGIONS R
on MK.ID_REGION_KOD=R.ID_REGION_KOD
left join MTP_ORG MO
on (MK.ID_KOD_F=MO.ID_KOD_F)
and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)
where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)
and(MK.NAME_ORG like '%трактор%')
order by MARKA_ID
limit 0, 50
Данный запрос прекрасно работает в MySQL, но совершенно не работает в PostgreSQL.
Чтоб работаело и там и там нужно писать на подобии:
select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,
MK.MARKA_ID as MARKA_ID,
MK.VID_ID,
MK.ZAV_NOMER as ZAV_NOMER,
MK.DVIG_NOMER as DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD,
MK.SER_SVID as SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE,
MK.DATE_UPDATE, MK.ID_REGION_KOD as ID_REGION_KOD,
MK.ID_RAJON as ID_RAJON, MK.ID_VID, MK.ID_KOD_F,
MK.NAME_ORG as NAME_ORG,
MK.NAME_VID as NAME_VID, MK.UPPER_ZAV_NOMER,
MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP
from MTP_KARTA MK
left join TBLREGIONS R
on MK.ID_REGION_KOD=R.ID_REGION_KOD
left join MTP_ORG MO
on (MK.ID_KOD_F=MO.ID_KOD_F)
and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)
where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)
and(MK.NAME_ORG like '%трактор%')
order by MARKA_ID
limit 50 offset 10
В чем отличие ?
1. Псевдоним поля задается через as: MK.ZAV_NOMER as ZAV_NOMER
2. В Limit указывается
не: limit 10,50
а: limit 50 offset 10
Такие конструкции работают как в mysql, так и в postgresql. У меня есть подозрение, что они есть стандартом SQL, т.е. вероятность срабатывания и в других серверах высокая.
Поэтому, в необходимо приходить к стандартам, которые устроит как MySQL так и PostgreSQL.
Рассмотрим для примера запрос:
select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,
MK.MARKA_ID MARKA_ID,MK.VID_ID, MK.ZAV_NOMER ZAV_NOMER, MK.DVIG_NOMER DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD, MK.SER_SVID SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE, MK.DATE_UPDATE, MK.ID_REGION_KOD ID_REGION_KOD, MK.ID_RAJON ID_RAJON, MK.ID_VID, MK.ID_KOD_F, MK.NAME_ORG NAME_ORG, MK.NAME_VID NAME_VID, MK.UPPER_ZAV_NOMER, MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_
OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP from MTP_KARTA MK
left join TBLREGIONS R
on MK.ID_REGION_KOD=R.ID_REGION_KOD
left join MTP_ORG MO
on (MK.ID_KOD_F=MO.ID_KOD_F)
and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)
where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)
and(MK.NAME_ORG like '%трактор%')
order by MARKA_ID
limit 0, 50
Данный запрос прекрасно работает в MySQL, но совершенно не работает в PostgreSQL.
Чтоб работаело и там и там нужно писать на подобии:
select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,
MK.MARKA_ID as MARKA_ID,
MK.VID_ID,
MK.ZAV_NOMER as ZAV_NOMER,
MK.DVIG_NOMER as DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD,
MK.SER_SVID as SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE,
MK.DATE_UPDATE, MK.ID_REGION_KOD as ID_REGION_KOD,
MK.ID_RAJON as ID_RAJON, MK.ID_VID, MK.ID_KOD_F,
MK.NAME_ORG as NAME_ORG,
MK.NAME_VID as NAME_VID, MK.UPPER_ZAV_NOMER,
MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP
from MTP_KARTA MK
left join TBLREGIONS R
on MK.ID_REGION_KOD=R.ID_REGION_KOD
left join MTP_ORG MO
on (MK.ID_KOD_F=MO.ID_KOD_F)
and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)
where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)
and(MK.NAME_ORG like '%трактор%')
order by MARKA_ID
limit 50 offset 10
В чем отличие ?
1. Псевдоним поля задается через as: MK.ZAV_NOMER as ZAV_NOMER
2. В Limit указывается
не: limit 10,50
а: limit 50 offset 10
Такие конструкции работают как в mysql, так и в postgresql. У меня есть подозрение, что они есть стандартом SQL, т.е. вероятность срабатывания и в других серверах высокая.
Комментарии