4

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

  1. 我有两张表,我正在尝试比较并找到类似的项目。表 A 称为“DONOTDELETE_FPTable”。表 B 称为“导入”。
  2. 我正在比较两个表中的相同列。IP、QID 和端口。
  3. 我的目标是在 DONOTDELETE_FPTable 中的 Imported 表中找到类似的记录。
  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 不应匹配且不会出现在查询中。

DONOOTDELETE_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/端口:

实际查询结果(问题 - Null 记录丢失)

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

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

4

2 回答 2

2

使用您添加到问题中的示例数据,我得到了您在 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 代表True0 代表False

于 2013-08-16T21:48:32.383 回答
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));

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

于 2013-08-20T14:44:01.427 回答