SQL查询-实现中的帮助

SQL查询-实现中的帮助,sql,oracle10g,Sql,Oracle10g,我有两个表:成员表和文档表 成员表: Memberkey(Key) Member country -------------- --------------- 111 Aus 222 US 333 Germany 444

我有两个表:成员表和文档表

成员表:

Memberkey(Key) Member country -------------- --------------- 111 Aus 222 US 333 Germany 444 Chile Memberkey(关键)成员国 -------------- --------------- 111澳大利亚 222美国 333德国 444智利 文件表:

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 Memberkey(notNULL)文档\类型\ cd文档\类别\ cd文档名 ---------------- ----------- ---------- ------------- 111 1销售单据 222 2 1财务文件 222 3 3法律文件 333 3法律文件 444 2 1财务文件 44433法律文件 我的要求是,仅当文档是合法的\u文档时(即文档类型\u cd=3和文档类别\u cd=3),才能获取memberkey、成员国和文档名称。如果成员不存在此类文档,则该文档应为空

输出:

Memberkey member country doc_name ---------- -------------- ----------- 111 aus NULL 222 US Legal_doc 333 Germany Legal_doc 444 Chile Legal_doc Memberkey成员国文件名 ---------- -------------- ----------- 111澳大利亚零 222美国法律文件 333德国法律文件 444智利法律文件 我怎样才能做到这一点?如果我在查询中对
doc\u type\u cd
doc\u cat\u cd
使用条件,那么将跳过那些没有合法文档的成员(本例中为111)。另外,如果一个成员在“document”表中没有条目,那么它还应该显示成员键、国家/地区和documentname(在本例中为NULL)。有什么有效的方法来实现这一点吗?
请帮忙。谢谢

您需要一个左连接来满足您的需求。通过在下面三个条件下左键连接,您将获得每个成员的一条记录,如果他们确实拥有法律文档,则该记录将填充在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

您希望使用case语句,并测试doc\u type\u cd或doc\u cat\u 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

以下是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)
添加到子查询。

下面是另一个可以在大多数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)

使用内部联接,您将跳过没有足够文档的任何成员。编辑制作。谢谢谢谢!有没有其他方法可以达到同样的效果。我指的是任何逻辑或功能?实际上,我已经提供了一个我陷入困境的情况的要点。我不确定我是否可以使用案例陈述,这就是我为什么要问的原因。Bill Gregg唯一的另一个潜在问题是,对于任何拥有多个文档(比如一个合法文档和一个非合法文档)的成员,您可以获得多个成员行。案例陈述非常直接,易于使用。它让您决定在逐行的基础上返回什么。查看universal表该行中的其他可用列,决定“哦,在这种情况下,我希望返回名称,否则我希望为NULL”。实际上,我的要求比这要复杂一些。但我已经解决了这些问题,但我的问题变得复杂起来。在这里,我提供了一个我陷入困境的要点。在我的情况下,我不能使用左连接。这就是为什么我试图找到任何逻辑或功能来实现这一点。谢谢你的帮助,我也很困惑。我投了两次反对票,但这是解决这个问题的正确方法。首先,告诉我们您使用哪种RDBMS您使用哪种RDBMS?我假设您在我的回答中使用了MSSQL,所以该查询无法在其他RDBMS上运行。