繁体   English   中英

如何通过减少选择和联接来改进POSTGRES(SQL)查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM