SQL查询 - 实现中的帮助

时间:2014-05-09 13:07:57

标签: sql oracle10g

我有两张桌子:会员文件

会员表:

Memberkey(Key)                    Member country
--------------                    ---------------
111                                   Aus
222                                   US
333                                   Germany
444                                   Chile 

文件表:

Memberkey(notNULL)  doc_type_cd   doc_cat_cd  docname                                          
----------------    -----------   ----------  -------------
111                        1         1          Sales_doc
222                        2         1          Finance_doc
222                        3         3          Legal_doc
333                        3         3          Legal_doc
444                        2         1          Finance doc
444                        3         3          Legal_doc

我的要求是仅在文档为legal_doc 时获取 memberkey 成员国 doc_name (即doc_type_cd = 3和doc_cat_cd = 3)。如果成员不存在此类文档,则应该为 null

输出:

Memberkey     member country   doc_name
----------    --------------   -----------
111              aus             NULL
222              US              Legal_doc
333              Germany         Legal_doc
444              Chile           Legal_doc

我怎样才能做到这一点?如果我在查询中的doc_type_cddoc_cat_cd上使用条件,则会跳过那些没有 legal_doc 的成员(在此示例中为111) )。此外,如果会员在"文件"表,然后它也应该显示成员密钥,国家和文件名(在这种情况下为NULL)。有没有有效的方法来实现这一目标? 请帮忙。谢谢!

4 个答案:

答案 0 :(得分:2)

您需要左连接才能满足您的要求。通过左下方加入以下三个条件,您将获得每个成员的记录,如果他们确实有一个合法文档,那么将填充在doc_name列中,如果他们没有合法文档,那么该值将为null

SELECT M.MemberKey,  M.[member country], D.doc_name
FROM Member M
LEFT JOIN Document D ON
M.MemberKey = D.MemberKey AND
D.doc_type_cd = 3 AND
D.doc_cat_cd = 3

答案 1 :(得分:0)

您想要使用case语句,并测试doc_type_cd或doc_cat_cd,如下所示:

select memberkey,
       [member country], 
       case when doc_type_cd = 3 or doc_cat_cd = 3 then doc_name else null end
from memberTable mt
left outer join documentTable dt
on mt.memberKey = dt.memberKey

答案 2 :(得分:0)

以下是 MSSQL

中的解决方案
SELECT
    M.MemberKey
    , M.MemberCountry
    , DCA.DocName
FROM
    [Member] M
    OUTER APPLY (
        SELECT
            D.DocName
        FROM
            [Document] D
        WHERE
            D.MemberKey = M.MemberKey
            AND D.doc_type_cd = 3
            AND D.doc_cat_cd =3
    ) DCA

请注意,如果有多个法律文件,此查询将检索多行。如果要获取第一个文档,请将TOP(1)添加到子查询中。

答案 3 :(得分:0)

这是另一个可以在大多数RDBMS上运行的解决方案:

-- Query to get all members with legal document
SELECT
    M.MemberKey
    , M.MemberCountry
    , D.DocName
FROM
    Member M
    INNER JOIN Document D
        ON M.MemberKey = D.MemberKey
WHERE
    D.doc_type_cd = 3
    AND D.doc_cat_cd =3

UNION ALL

-- Query to get all members without legal document
SELECT
    M.MemberKey
    , M.MemberCountry
    , NULL AS DocName
FROM
    Member M
WHERE
    NOT EXISTS (SELECT 1 FROM Document D WHERE D.MemberKey = M.MemberKey AND D.doc_type_cd = 3 AND D.doc_cat_cd = 3)