SQL查询-实现中的帮助
我有两个表:成员表和文档表 成员表: 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智利法律文件 我怎样才能做到这一点?如果我在查询中对SQL查询-实现中的帮助,sql,oracle10g,Sql,Oracle10g,我有两个表:成员表和文档表 成员表: Memberkey(Key) Member country -------------- --------------- 111 Aus 222 US 333 Germany 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上运行。