SQL查询:面对从不同表中获取所需记录的问题

时间:2017-06-15 07:57:37

标签: sql database oracle

我有两张桌子

  1. 日历(Calname,CCode,PCode)

  2. 查找(LCode,姓名)

    日历表包含记录,

    Calname | CCode | PCode
    
    abc     | O_R   | P_R
    
    xyz     | C_R   | P_C
    

    查找表包含记录,

    LCode | Name
    
    O_R   | Reporting
    
    C_R   | Cross
    
    P_R   | Process
    
    P_C   | ProcessCross
    
  3. 我必须以一种方式获取记录,我可以从查找表中获取包含记录行的所有代码的名称。

    期望输出,

        Calname | CCode | PCode | CCodeName | PCodeName
    
        abc     | O_R   | P_R   | Reporting | Process
    
        xyz     | C_R   | P_C   | Cross     | ProcessCross
    

    我不能在代码的基础上简单地应用内连接,它不会给我想要的输出。 我试图使用子查询,但它没有以某种方式解决, 。 任何人都可以帮我解决这个问题。

    由于

2 个答案:

答案 0 :(得分:3)

您可以尝试使用两个代码中的每一个将Calendar表加入Lookup表两次。

SELECT
    c.Calname,
    c.CCode,
    c.PCode,
    COALESCE(t1.Name, 'NA') AS CCodeName,
    COALESCE(t2.Name, 'NA') AS PCodeName
FROM Calendar c
LEFT JOIN Lookup t1
    ON c.CCode = t1.LCode
LEFT JOIN Lookup t2
    ON c.PCode = t2.LCode

答案 1 :(得分:1)

Tim的答案的另一种选择是使用标量子查询,由于标量子查询缓存,这些子查询可能会或可能不会给你一些性能优势:

SELECT
    c.Calname,
    c.CCode,
    c.PCode,
    COALESCE((SELECT l1.name FROM lookup l1 WHERE c.ccode = l1.lcode), 'NA') AS CCodeName,
    COALESCE((SELECT l2.name FROM lookup l2 WHERE c.pcode = l2.lcode), 'NA') AS PCodeName
FROM Calendar c;

我会测试两个答案,看看哪一个最适合您的数据。