我有两张桌子:会员和文件
会员表:
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_cd
和doc_cat_cd
上使用条件,则会跳过那些没有 legal_doc 的成员(在此示例中为111) )。此外,如果会员在"文件"表,然后它也应该显示成员密钥,国家和文件名(在这种情况下为NULL)。有没有有效的方法来实现这一目标?
请帮忙。谢谢!
答案 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)