我试图从左表中取出那些不在右表中的记录。我在左表中有大约5000条记录。同样,需要在超过3-4个表上完成同样的事情。我必须找出第一张表中不在我的3-4张表中的记录。相同的主要或外键概念正在发挥作用。
我的第一次尝试取两张桌子,从原来的5k记录中取出5,70,000条记录。重复记录。
SELECT m.* FROM members m, pinnumber p where p.pinmemberid != m.memberid
我的第二次尝试也让my-sql浏览器挂起。
SELECT m.* FROM members m
LEFT JOIN pinnumber p ON p.pinmemberid != m.memberid
LEFT JOIN customer c ON m.memberid != c.memberid
我的第三次尝试也花了很多时间
SELECT * FROM members m
WHERE 1=1 AND AND not exists ( select 1 from pinnumber p where 1=1 And
p.pinmemberid = m.memberid AND p.pinproductid LIKE '%Remit%')
AND not exists ( select 1 from customer c where 1=1 and c.card_name is not null AND m.memberid = c.memberid )
请建议我怎么做。如果我需要将非equi联接放在此。
答案 0 :(得分:1)
此查询将尝试使用表members
和pinnumber
加入第一个表customer
:
SELECT m.*
FROM
members m
LEFT JOIN pinnumber p ON p.pinmemberid = m.memberid
LEFT JOIN customer c ON m.memberid = c.memberid
WHERE p.pinmemberid is null and c.memberid is null
由于我们使用的是left join
,因此查询将返回所有成员行,但如果联接未成功pinmemberid
,则memberid
将为null
。这些值为null
的行是右表中不存在的行。您可能希望使用OR而不是AND。
如果您使用!=
条件的连接,您将获得第一个表的所有行与第二个表的所有行相乘,但具有相同ID的行除外。
获得相同结果的另一种方法是:
SELECT members.*
FROM members
WHERE
memberid not in (select pinmembedid from pinnumber)
and memberid not in (select memberid from customer)
(如果您愿意,可以用OR替换AND)。 NOT IN子句可能会慢一点,但它更容易理解。
答案 1 :(得分:0)
顺便说一句,你要做的是:
SELECT m.* FROM members m
LEFT JOIN pinnumber p ON p.pinmemberid = m.memberid
LEFT JOIN customer c ON m.memberid = c.memberid
where p.pinmemberid is null and c.pinmemberid is null
当右表中没有记录时,left join
会产生NULL值。您可以在加入后过滤这些内容。
答案 2 :(得分:0)
我希望该命令能够产生您想要的输出。
SELECT m。* FROM成员m LEFT JOIN引脚号p ON p.pinmemberid = m.memberid,其中m.memberid为null;