如何连接两个db表并交叉引用另一个

时间:2010-07-12 13:08:02

标签: sql mysql

我正在尝试找出一种有效的方法来连接表和与另一个表交叉引用,引用的目的是检查在连接中找到的每个记录是否都没有另一个表中存在的字段。

这就是我到目前为止 - 我需要能够确保每个记录的reg_no不存在于买方表中(基本上在发送自动电子邮件之前)。感谢任何指针 - 任何可以让我不得不遍历每条记录并进行单独查找的东西!

SELECT * FROM (`owners`, `buyers`) 
 JOIN `records` ON (`records`.`pa_no` = `owners`.`contact_no`) 
 WHERE email <> "" AND `buyers`.reg_no <> `records`.reg_no

2 个答案:

答案 0 :(得分:0)

尝试:

select * from `owners`
join `records` ON (`records`.`pa_no` = `owners`.`contact_no`)
WHERE email <> ""
and not exists (select reg_no from `buyers` 
                where `buyers`.reg_no = `records`.reg_no)

答案 1 :(得分:0)

你的意思是LEFT JOIN吗?

SELECT r.reg_no
  FROM records as r LEFT JOIN buyers as b ON (r.reg_no = b.reg_no)
  WHERE b.reg_no IS NULL

表A和B之间的LEFT JOIN将为您提供一个表,其中A中的每一行至少有一行。使用普通JOIN时,将忽略A中未找到B中相关行的行;对于LEFT JOIN,将包含这些行,但B的所有列都将只包含NULL值。因此,您可以测试永远不会为NULL的字段(如主键或外键):如果它为NULL,那么您确定此行(A)在B中没有关联的行。

如果我正确理解了您的问题,这就是您想要的 - records中的所有行(以及owner信息)中没有关联buyer信息的表格

所以,您可以使用类似上面的内容作为子查询或视图,并使用owner正常加入它,或者您可以将其全部合并到一起(我相信MySQL应该足够智能以优化它,所以这些方法是等效的):

SELECT * -- though probably you want to specify what columns you want
  FROM (owners o JOIN records r ON (o.contact_no=r.pa_no))
    LEFT JOIN buyers b ON (r.reg_no=b.reg_no)
  WHERE email<>'' AND b.reg_no IS NULL

(我只是输入它,因为我认为它可能有用,我没有测试过。如果我错了请纠正我。)