【问题标题】:Query between two tables to find like records that includes Null values在两个表之间查询以查找包含 Null 值的类似记录
【发布时间】:2013-08-16 20:55:24
【问题描述】:

我在 MS Access 2010 中开发查询时遇到了一些问题。到目前为止,我还没有在网上找到解决方案,但我觉得我已经很接近了。这是我想要做的:

  1. 我有两个表,我正在尝试比较和查找相似的项目。表 A 称为“DONOTDELETE_FPTable”。表 B 称为“已导入”。
  2. 我正在比较两个表中的相同列。 IP、QID 和端口。
  3. 我的目标是在 Imported 表中找到 DONOTDELETE_FPTable 中出现的类似记录。
  4. 我在上面提到的所有列上都有一个从 DONOTDELETE_FPTable 到 Import 表的左连接设置。

问题: 我有一种情况,记录可能在两个表的 PORT 列中都有空值。我需要查询返回:

  1. 两个表中所有列数据相同的所有匹配记录
  2. 以及在两个表之间的 PORT 列中具有匹配 IP、QID 和可能为 null 的任何匹配记录。

这是我此时使用“LIKE”标准的 SQL。我删除了一个我试图测试空值的数据,因为我无法让它工作。提前感谢您的帮助。

SQL 语句:

SELECT DONOTDELETE_FPExcept.*
FROM
    DONOTDELETE_FPExcept
    LEFT JOIN Imported
    ON
            (DONOTDELETE_FPExcept.Port = Imported.PORT)
        AND (DONOTDELETE_FPExcept.QID = Imported.QID)
        AND (DONOTDELETE_FPExcept.IP = Imported.IP)
WHERE
        (((Imported.IP) Like [DONOTDELETE_FPExcept].[ip])
    AND ((Imported.qid) Like [DONOTDELETE_FPExcept].[QID])
    AND ((Imported.PORT) Like [DONOTDELETE_FPExcept].[Port]));

以下是表格中的一些示例数据。IP、QID 和端口是列:

导入表:

  • 记录 1:IP:10.1.1.1 / QID:225 / 端口:80
  • 记录 2:IP:10.1.1.1 / QID:111 / 端口:
  • 记录 3:IP:10.1.1.5 / QID:999 / 端口:8080
  • 记录 4:IP:10.1.1.5 / QID:999 / 端口:

注意:记录 2 - 空白端口为空。记录 3 不应匹配且不会出现在查询中。

DONOTDELETE_FPTable

  • 记录 1:IP:10.1.1.1 / QID:225 / 端口:80
  • 记录 2:IP:10.1.1.1 / QID:111 / 端口:

查询的预期结果(两个表之间的匹配记录与 Null):

  • 记录 1:IP:10.1.1.1 / QID:225 / 端口:80
  • 记录 2:IP:10.1.1.1 / QID:111 / 端口:

实际查询结果(Issue - Null record is missing)

  • 记录 1:IP:10.1.1.1 / QID:225 / 端口:80

  • 记录 2:IP:10.1.1.5 / QID:999 / 端口:

【问题讨论】:

  • 如果能正确格式化SQL语句就好了。
  • 对不起那个路易斯。感谢您的帮助。

标签: ms-access null ms-access-2010


【解决方案1】:

使用您添加到问题中的示例数据,我得到了您在 Access 2007 中使用此查询要求的结果:

SELECT
    d.Record_id AS d_id,
    d.IP,
    d.QID,
    d.Port,
    i.Record_id AS i_id
FROM
    DONOTDELETE_FPExcept AS d
    LEFT JOIN Imported AS i
    ON (d.QID = i.QID) AND (d.IP = i.IP)
WHERE
        d.Port = i.Port
    OR (d.Port Is Null AND i.Port Is Null);

如果您没有通过该查询获得预期结果,请确认两个表中的“空白”Port 值确实为 Null。如果Port 是一个文本字段,它可能包含空字符串、空格或非打印字符......其中任何一个都很难通过视觉检查与 Null 区分开来。您可以对每个表运行一个简单的查询来检查。

SELECT t.Port, IsNull(t.Port) AS port_is_null
FROM Imported AS t;

在该查询的结果中,-1 代表True,0 代表False

【讨论】:

  • 感谢您的快速回答。让我看看这个并尝试一下。
  • 不幸的是,它没有用。我仍然遇到上面列出的问题。似乎 MS Access 2010 在使用其查询设计 GUI 时添加了多余的 () []。我没有添加额外的数据。但是,您上面的解决方案给了我一些新想法,所以我将尝试不同的方法。
  • 我在上面的问题中进行了编辑,以包含您询问的表格数据。无论我如何分割它,我仍然会遇到这个问题。再次感谢您的帮助。
  • 哇。感谢所有的投入。这帮助很大。让我玩这个,我会回复你的。祝您度过一个愉快的夜晚或一天,具体取决于您来自哪里。
  • 不客气。请注意我刚刚修复了IsNull 查询,还删除了INNER JOIN 建议。
【解决方案2】:

这是我提出的问题的解决方案。在测试了不同的场景后,我发现我的查询得到了预期的结果。这是 MS Access 2010 查询。请注意,MS Access 添加了额外的标点符号,我相信这是我最初的问题:

MS Access 中的 SQL 代码:

SELECT Imported.ip, Imported.qid, Imported.port

FROM

DONOTDELETE_FPExcept 
LEFT JOIN Imported 
ON 
     (DONOTDELETE_FPExcept.QID = Imported.QID) 
     AND (DONOTDELETE_FPExcept.IP = Imported.IP)

WHERE 
     (((Imported.ip)=DONOTDELETE_FPExcept.IP)       And  
     (Imported.qid)=DONOTDELETE_FPExcept.qid)       And
     ((Imported.port)=DONOTDELETE_FPExcept.Port))   Or 
     (((Imported.port) Is Null)                     And 
     ((DONOTDELETE_FPExcept.port) Is Null));

让我知道你的想法。再次感谢您的帮助。

【讨论】:

  • 会的。有什么办法可以给你代表点数来帮助我吗?再次感谢,希望有一天能帮到你。
  • 不客气,乔姆。请不要替我担心积分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多