2016-11-22 66 views
0

我有这样的更换不符合LEFT JOIN

[condition] 
    condition_id, (pk) 
    question_id (fk) 

[option] 
    condition_id, (fk) 
    ext_id (fk) 

[external] 
    ext_id, (pk) 
    inst_id (fk) 

[instance] 
    inst_id, (pk) 
    keeper_id (fk) 

[keeper] 
    keeper_id, (pk) 
    org_id 

[question] 
    question_id (pk) 
    org_id 

[localization] 
    question_id (fk, pk), 
    org_id (pk), 
    language (pk) 
    label 

我需要从question表本地化的所有问题(从localization表),即不condition表存在的表结构某些ext_id

我的查询是

SELECT 
    q.question_id as q_id, 
    l.label as q_value 
FROM question q 
    INNER JOIN localization l 
     ON l.question_id = q.question_id 
    INNER JOIN external ex 
     ON ex.ext_id = 'EXTERNAL_ID' 
    INNER JOIN instance i 
     ON i.inst_id = ex.inst_id 
    INNER JOIN keeper k 
     ON k.keeper_id = i.keeper_id 
WHERE q.org_id IN ('*', k.org_id) 
    AND l.org_id = '*' 
    AND l.language = 'EN' 
    AND q.question_id NOT IN (
     SELECT 
      question_id 
     FROM condition c 
      INNER JOIN option o 
       ON o.condition_id = c.condition_id 
     WHERE o.ext_id = 'EXTERNAL_ID' 
    ) 

但如何更换使用LEFT子查询加入?

+0

请注明RDBMS – swe

+0

@swe更新标签 – lapots

+0

您的查询在语法上不正确。什么是'lq'?什么是'p'? –

回答

1

这里有一种方法

SELECT p.question_id AS q_id, 
     l.label  AS q_value 
FROM question q 
     INNER JOIN localization l 
       ON l.question_id = q.question_id 
     INNER JOIN EXTERNAL ex 
       ON ex.ext_id = 'EXTERNAL_ID' 
     INNER JOIN instance i 
       ON i.inst_id = ex.inst_id 
     INNER JOIN keeper k 
       ON k.keeper_id = i.keeper_id 
     LEFT JOIN (select distinct c.question_id 
      from condition c 
       JOIN option o 
       ON o.condition_id = c.condition_id 
       AND o.ext_id = 'EXTERNAL_ID') c 
       ON c.question_id = q.question_id 
WHERE q.org_id IN ('*', k.org_id) 
     AND l.org_id = '*' 
     AND l.language = 'EN' 
     AND c.question_id IS NULL 

我不是在Postgres的一个专家,但我更喜欢NOT EXISTS做到这一点

SELECT p.question_id AS q_id, 
     l.label  AS q_value 
FROM question q 
     INNER JOIN localization l 
       ON l.question_id = q.question_id 
     INNER JOIN EXTERNAL ex 
       ON ex.ext_id = 'EXTERNAL_ID' 
     INNER JOIN instance i 
       ON i.inst_id = ex.inst_id 
     INNER JOIN keeper k 
       ON k.keeper_id = i.keeper_id 
WHERE q.org_id IN ('*', k.org_id) 
     AND l.org_id = '*' 
     AND l.language = 'EN' 
     AND NOT EXISTS (SELECT 1 
         FROM condition c 
           INNER JOIN option o 
             ON o.condition_id = c.condition_id 
         WHERE o.ext_id = 'EXTERNAL_ID' 
           AND q.question_id = c.question_id) 
+0

嗯,第一个查询返回的记录数比第二个少 – lapots

+0

@ user1432980 - 现在检查 –

+0

假设在'('应该是'LEFT JOIN'它返回正确数量的记录。我有同样的问题,当我试图转换为纯'LEFT JOIN'。问题是什么 – lapots