NON Equi加入超过2张桌子

时间:2012-12-12 23:23:16

标签: mysql sql sql-server

我试图从左表中取出那些不在右表中的记录。我在左表中有大约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联接放在此。

3 个答案:

答案 0 :(得分:1)

此查询将尝试使用表memberspinnumber加入第一个表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;