0

我试图只从左表中取出那些不在右表中的记录。我在左表中有近 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 )

请建议我该怎么做。如果我需要对此进行非平等加入。

4

3 回答 3

1

此查询将尝试将第一个表members与表pinnumbercustomer

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

由于我们使用的是 a left join,因此查询将返回所有成员行,但如果连接不成功pinmemberidmemberid则会返回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 子句可能会慢一些,但更容易理解。

于 2012-12-12T23:25:41.110 回答
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 值。您可以在加入后过滤这些。

于 2012-12-13T02:48:12.990 回答
0

我希望这个命令会产生你想要的输出..

SELECT m.* FROM members m LEFT JOIN pinnumber p ON p.pinmemberid = m.memberid where m.memberid is null;
于 2018-08-04T16:14:33.133 回答