【问题标题】:En Query ing minds want to knowEn Query ing minds want to know
【发布时间】:2023-03-18 06:39:01
【问题描述】:

我正在尝试比较一个包含超过 300,000 行的庞大表和一个小得多的表,以查看数据是否在大表中而不是在小表中。这是我的基本想法:

代码:

select TOAWorkOrdersNew.TechNum AS TOATechNum,
TOAWorkOrdersNew.FirstName AS TOAFirst,
TOAWorkOrdersNew.LastName AS TOALast,
TOAWorkOrdersNew.Title AS TOATitle,
TOAWorkOrdersNew.WorkDate AS TOAWorkDate,
Techs.TechNum AS TechNum,
Techs.FirstName AS FirstName,
Techs.LastName AS LastName,
Techs.JobDesc AS Job

from TOAWorkOrdersNew, Techs

where 

!!!!!    TOAWorkOrdersNew.WorkDate between '2013-05-15' and '2013-05-31' AND
TOAWorkOrdersNew.TechNum ***IS NOT FOUND INSIDE*** Techs.TechNum    !!!

Techs.TechNum 是 Techs 的唯一键。

一如既往地感谢您的帮助, 时间

【问题讨论】:

  • 看,你真的不能避免学习 SQL...
  • 如果 Techs 表中不存在 TechNum,您希望如何从 techs 表中返回数据?

标签: mysql join compare


【解决方案1】:

很难理解您想从 Techs 表中返回什么,因为您不希望 TechNum 存在于 Techs 表中。

这是一个使用OUTER JOIN 并检查NULL 的选项:

select TOAWorkOrdersNew.TechNum AS TOATechNum,
    TOAWorkOrdersNew.FirstName AS TOAFirst,
    TOAWorkOrdersNew.LastName AS TOALast,
    TOAWorkOrdersNew.Title AS TOATitle,
    TOAWorkOrdersNew.WorkDate AS TOAWorkDate,
    Techs.TechNum AS TechNum,
    Techs.FirstName AS FirstName,
    Techs.LastName AS LastName,
    Techs.JobDesc AS Job
from TOAWorkOrdersNew left join 
    Techs on TOAWorkOrdersNew.TechNum = Techs.TechNum 
where Techs.TechNum is null 
    and TOAWorkOrdersNew.WorkDate between '2013-05-15' and '2013-05-31'

这将返回 TOAWorkOrdersNew 中 techs 表中不存在 technum 的所有记录。因此,technum、firstname、lastname 和 job 字段都将是 NULL

【讨论】:

    【解决方案2】:

    如果我理解正确的话......

    使用左连接:

    SELECT TOAWorkOrdersNew.TechNum AS TOATechNum,
        TOAWorkOrdersNew.FirstName AS TOAFirst,
        TOAWorkOrdersNew.LastName AS TOALast,
        TOAWorkOrdersNew.Title AS TOATitle,
        TOAWorkOrdersNew.WorkDate AS TOAWorkDate,
        Techs.TechNum AS TechNum,
        Techs.FirstName AS FirstName,
        Techs.LastName AS LastName,
        Techs.JobDesc AS Job
    FROM Techs LEFT JOIN TOAWorkOrdersNew ON TOAWorkOrdersNew.TechNum = Techs.TechNum 
        AND TOAWorkOrdersNew.WorkDate BETWEEN '2013-05-15' and '2013-05-31' 
    WHERE TOAWorkOrdersNew.TechNum IS NULL
    

    要查找两个表中的所有 ARE,您可以将其更改为内连接(摆脱 IS NULL 语句)或将 IS NULL 更改为 IS NOT NULL。

    真的,如果您只对查找其他表中没有记录的记录感兴趣,我希望您能找到以下内容:

    SELECT t.firstName, t.lastName, t.jobDesc [job]
    FROM Techs t
        LEFT JOIN TOAWorkOrdersNew toa ON toa.techNum = t.techNum 
           AND toa.WorkDate BETWEEN '2013-05-15' and '2013-05-31' 
    WHERE toa.technum IS NULL
    

    【讨论】:

    • 不要将WorkDate 条件放在OUTER JOIN 中——它不会返回正确的结果。将其移至 WHERE 子句中。
    猜你喜欢
    • 2021-09-28
    • 2016-08-20
    • 2022-12-01
    • 2022-11-20
    • 2022-12-04
    • 2022-12-16
    • 2022-12-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多