2014-11-20 163 views
0

我有表避免在查询

M,R,G,d,PT和PI

PI具有与所有其他表的关系。 有一个父 - M,R,G和D的子关系

实施例:型号ID将在那里在M和R 范围ID将在那里在R和G 级ID将在那里在G中和d

要知道其被发布的衍生物,示例是如下

SELECT D.DERIVATIVE_ID 
FROM PRD.DERIVATIVE D 
     JOIN PUB.PUBLISHED_ITEM PI ON PI.PUBLISHED_OBJECT_ID = D.DERIVATIVE_ID 
             AND PI.PUBLISHED_OBJECT_TYPE = 'DERIVATIVE' 
     JOIN PUB.PUBLISHED_TARGET PT ON PI.PUBLISHED_TARGET_ID = PT.PUBLISHED_TARGET_ID 
WHERE D.DERIVATIVE_ID = 683239 

要知道其被发布的模型,一个例子是如下面

SELECT * 
FROM PRD.MODEL M 
     JOIN PUB.PUBLISHED_ITEM PI ON PI.PUBLISHED_OBJECT_ID = M.MODEL_ID 
             AND PI.PUBLISHED_OBJECT_TYPE = 'MODEL' 
     JOIN PUB.PUBLISHED_TARGET PT ON PI.PUBLISHED_TARGET_ID = PT.PUBLISHED_TARGET_ID 
WHERE M.model_id = 257 

我想编写一个查询,显示模式,其衍生物公布,但不是模型(模型没有公布)

这里是我试过了,您的意见将是有益的

SELECT * 
FROM PRD.MODEL M 
     JOIN PUB.PUBLISHED_ITEM PI ON PI.PUBLISHED_OBJECT_ID = M.MODEL_ID 
             AND PI.PUBLISHED_OBJECT_TYPE = 'MODEL' 
     JOIN PUB.PUBLISHED_TARGET PT ON PI.PUBLISHED_TARGET_ID <> PT.PUBLISHED_TARGET_ID 
     JOIN PRD.RANGE R ON R.MODEL_ID = M.MODEL_ID 
     JOIN PRD.GRADE G ON G.RANGE_ID = R.RANGE_ID 
     JOIN prd.DERIVATIVE D ON D.GRADE_ID = G.GRADE_ID 
           AND D.DERIVATIVE_ID IN (
           SELECT D.DERIVATIVE_ID 
           FROM PRD.DERIVATIVE D 
             JOIN PUB.PUBLISHED_ITEM PI ON PI.PUBLISHED_OBJECT_ID = D.DERIVATIVE_ID 
                   AND PI.PUBLISHED_OBJECT_TYPE = 'DERIVATIVE' 
             JOIN PUB.PUBLISHED_TARGET PT ON PI.PUBLISHED_TARGET_ID = PT.PUBLISHED_TARGET_ID) 

同样在上面的查询中,我该如何避免使用“IN”?

+0

THX重新格式化,你用什么工具? – Beth 2014-11-20 17:25:33

+0

我使用SQL提示 - 非常值得花钱! – 2014-11-20 17:30:09

回答

0

通常的方法是EXISTS

SELECT * 
FROM PRD.MODEL M 
JOIN PUB.PUBLISHED_ITEM PI 
    ON PI.PUBLISHED_OBJECT_ID = M.MODEL_ID 
     AND PI.PUBLISHED_OBJECT_TYPE = 'MODEL' 
JOIN PUB.PUBLISHED_TARGET PT 
    ON PI.PUBLISHED_TARGET_ID <> PT.PUBLISHED_TARGET_ID 
JOIN PRD.RANGE R 
    ON R.MODEL_ID = M.MODEL_ID 
JOIN PRD.GRADE G 
    ON G.RANGE_ID = R.RANGE_ID 
JOIN prd.DERIVATIVE D 
    ON D.GRADE_ID = G.GRADE_ID 
WHERE EXISTS (
     SELECT 1 
     FROM PRD.DERIVATIVE D_s 
     JOIN PUB.PUBLISHED_ITEM PI_s 
      ON PI_s.PUBLISHED_OBJECT_ID = D_S.DERIVATIVE_ID 
      AND PI_s.PUBLISHED_OBJECT_TYPE = 'DERIVATIVE' 
     JOIN PUB.PUBLISHED_TARGET PT_s 
      ON PI_s.PUBLISHED_TARGET_ID = PT_s.PUBLISHED_TARGET_ID 
     WHERE D_s.DERIVATIVE_ID = D.DERIVATIVE_ID 
     ) 
0

使用INNER Join可以避免。

SELECT * 
FROM PRD.MODEL M 
     JOIN PUB.PUBLISHED_ITEM PI 
     ON PI.PUBLISHED_OBJECT_ID = M.MODEL_ID 
      AND PI.PUBLISHED_OBJECT_TYPE = 'MODEL' 
     JOIN PUB.PUBLISHED_TARGET PT 
     ON PI.PUBLISHED_TARGET_ID <> PT.PUBLISHED_TARGET_ID 
     JOIN PRD.RANGE R 
     ON R.MODEL_ID = M.MODEL_ID 
     JOIN PRD.GRADE G 
     ON G.RANGE_ID = R.RANGE_ID 
     JOIN prd.DERIVATIVE d 
     ON d.GRADE_ID = g.GRADE_ID 
     JOIN (SELECT DISTINCT D.DERIVATIVE_ID 
      FROM PRD.DERIVATIVE D 
        JOIN PUB.PUBLISHED_ITEM PI 
         ON PI.PUBLISHED_OBJECT_ID = D.DERIVATIVE_ID 
         AND PI.PUBLISHED_OBJECT_TYPE = 'DERIVATIVE' 
        JOIN PUB.PUBLISHED_TARGET PT 
         ON PI.PUBLISHED_TARGET_ID = PT.PUBLISHED_TARGET_ID) AA 
     ON D.DERIVATIVE_ID = AA.DERIVATIVE_ID 

通过使用Exists

SELECT * 
FROM PRD.MODEL M 
     JOIN PUB.PUBLISHED_ITEM PI 
     ON PI.PUBLISHED_OBJECT_ID = M.MODEL_ID 
      AND PI.PUBLISHED_OBJECT_TYPE = 'MODEL' 
     JOIN PUB.PUBLISHED_TARGET PT 
     ON PI.PUBLISHED_TARGET_ID <> PT.PUBLISHED_TARGET_ID 
     JOIN PRD.RANGE R 
     ON R.MODEL_ID = M.MODEL_ID 
     JOIN PRD.GRADE G 
     ON G.RANGE_ID = R.RANGE_ID 
     JOIN prd.DERIVATIVE D 
     ON D.GRADE_ID = G.GRADE_ID 
WHERE EXISTS (SELECT 'X' 
       FROM PRD.DERIVATIVE ED 
         JOIN PUB.PUBLISHED_ITEM EPI 
         ON EPI.PUBLISHED_OBJECT_ID = ED.DERIVATIVE_ID 
          AND EPI.PUBLISHED_OBJECT_TYPE = 'DERIVATIVE' 
         JOIN PUB.PUBLISHED_TARGET EPT 
         ON EPI.PUBLISHED_TARGET_ID = EPT.PUBLISHED_TARGET_ID 
       WHERE ED.DERIVATIVE_ID = D.DERIVATIVE_ID) 
+0

谢谢你的回应,他们很有帮助 – Techie 2014-11-21 10:50:35