[英]How can I improve this POSTGRES (SQL) query by reducing the selects and joins?
我敢肯定,下面的代码是更好的语法方法,那就是,下面的代码足以实现所需的结果,但是我想使用适当的语法来做到这一点,并可能删除/减少不必要的联接和选择在同一张桌子上。
(即,多次使用rg.NAME和T.NAME字段)
INSERT INTO BSHIP (ID, IS_ID, C_ID, A_A_ID, A_A_INSTID, P_ID)
SOME_ID,
(SELECT t.IS_ID FROM T t LEFT OUTER JOIN BSHIP ON T.IS_ID=BSHIP.IS_ID WHERE T.NAME='XYZ'),
(SELECT t.id FROM T t LEFT OUTER JOIN BSHIP ON T.IS_ID=BSHIP.IS_ID WHERE T.NAME='XYZ'),
(SELECT rg.objbshps_id FROM RT_GP rg LEFT OUTER JOIN T ON rg.IS_ID=T.IS_ID WHERE T.NAME='XYZ' AND rg.NAME='ABC'),
(SELECT t.IS_ID FROM T t LEFT OUTER JOIN BSHIP ON T.IS_ID=BSHIP.IS_ID WHERE T.NAME='XYZ'),
(SELECT rg.id FROM RT_GP rg LEFT OUTER JOIN T ON rg.IS_ID=T.IS_ID WHERE T.NAME='XYZ' AND rg.NAME='ABC'),
ON CONFLICT DO NOTHING;
您似乎想要这样的东西:
INSERT INTO BSHIP (ID, IS_ID, C_ID, A_A_ID, A_A_INSTID, P_ID)
SELECT SOME_ID, t.IS_ID, t_id
(SELECT rg.objbshps_id FROM RT_GP rg
WHERE rg.IS_ID = T.IS_ID AND rg.NAME = 'ABC'),
t.IS_ID,
(SELECT rg.id FROM RT_GP rg WHERE rg.IS_ID = T.IS_ID AND rg.NAME = 'ABC')
FROM t
WHERE t.NAME = 'XYZ'
ON CONFLICT DO NOTHING;
这对我有效,并且更清洁。
INSERT INTO BSHIP (ID, IS_ID, C_ID, A_A_ID, A_A_INSTID, P_ID)
SOME_ID, t.IS_ID, t_id, rg.objbshps_id, t.IS_ID, rg.ID
FROM t, RT_GP rg
WHERE t.NAME = 'XYZ'
AND rg.NAME = 'ABC'
AND rg.IS_ID = T.IS_ID
ON CONFLICT DO NOTHING;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.