我有两张桌子,
ID NAME
-------------------
12 Jon Doe
4 Jane Doe
9 Sam Doe
和
MemID Cat# DateChkOut DateDue DateRet
4 T 430.98 1956 15-Mar-2011 14-Jun-2011 31-May-2011
12 B 125.2 2013 15-Mar-2011 14-Jun-2011
4 T 430.98 1956 27-Dec-2012 25-Mar-2013
现在我需要列出从未签出书籍的“会员”名字。
SELECT Name FROM MEMBER, CHECKOUT WHERE ID != MemID;
没用。有什么建议吗?
答案 0 :(得分:1)
SELECT name FROM member WHERE id NOT IN (SELECT MemID FROM checkout)
我认为它应该完成这项工作
答案 1 :(得分:1)
SELECT id,
name
FROM Member
WHERE id NOT IN
(SELECT memid
FROM checkout)
或
SELECT id,
name
FROM member m
LEFT OUTER JOIN checkout c ON m.id = c.memid
WHERE c.memid IS NULL
答案 2 :(得分:1)
使用NOT EXISTS的相关子查询。
SELECT Name
FROM MEMBER a
WHERE NOT EXISTS(SELECT 1 FROM CHECKOUT b WHERE b.MemID = a.ID)
答案 3 :(得分:1)
在这种情况下,您需要使用LEFT JOIN
。
尝试以下方法:
SELECT M.Name
FROM MembersTable M
LEFT JOIN CheckoutTable C On C.MemId = M.ID
WHERE C.MemId IS NULL
编辑:
LEFT JOIN
适用于这种情况,因为它将公共密钥上的两个表连接起来 - 在本例中为MemId
。由于这是LEFT JOIN
,它将占用Left表(Members)中存在的所有内容,如果找到匹配项,它将包含Right表(Checkout)上的所有内容。但如果在Checkout表中找不到匹配项,那么该方面的所有内容都将为NULL
。
因此,您需要做的就是检查右侧是否为NULL
。
希望这是有道理的:)
答案 4 :(得分:1)
如果您在查询中使用NOT IN
,对于大型查询来说可能会很慢,请尝试使用JOIN
,这样会更快:
SELECT MEMBER.NAME FROM MEMBER
LEFT JOIN CHECKOUT ON CHECKOUT.MemID = MEMBER.ID
WHERE CHECKOUT.MemID IS NULL:
答案 5 :(得分:1)
因为您可能希望返回更多字段,所以外连接是实现此目的的好方法。
SELECT Name
FROM MEMBER M
LEFT JOIN CHECKOUT C
on M.ID = C.MemID
WHERE C.MemID is null;
答案 6 :(得分:1)
试试这个:
SELECT M.ID,M.Name
FROM MEMBER M LEFT JOIN
CHECKOUT C ON C.MemID=M.ID
WHERE C.DateRet IS NULL
它将选择DateRet
为空的用户详细信息。
示例结果:
ID NAME
-------------------
12 Jon Doe
4 Jane Doe
答案 7 :(得分:1)
您必须使用where in
并检查DateChkOut
:
SELECT Name
FROM MEMBER
WHERE ID not in
( select MemID
from CHECKOUT
where DateChkOut is not null
)