在两个表之间查询以查找包含Null值的类似记录

时间:2013-08-16 20:55:24

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

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

  1. 我有两张桌子,我正在尝试比较并找到相似的项目。表A称为“DONOTDELETE_FPTable”。表B称为“已导入”。
  2. 我正在比较两个表中的相同列。 IP,QID和PORT。
  3. 我的目标是在DONOTDELETE_FPTable中的Imported表中找到类似的记录。
  4. 我在上面提到的所有列上从DONOTDELETE_FPTable到Import表都有一个Left Join设置。
  5. 问题: 我有一种情况,两个表中的PORT列中的记录可能具有空值。我需要查询返回:

    1. 所有列中具有相同数据的两个表之间的所有匹配记录
    2. 和在两个表之间的PORT列中具有匹配的IP,QID和可能的空值的任何匹配记录。
    3. 这是我此时使用“LIKE”标准的SQL。我删除了一个数据,我正在尝试测试null,因为我无法让它工作。谢谢你提前帮忙。

      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和Port是列:

      导入表格

      • 记录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 /端口:

      实际查询结果(问题 - 缺少空记录)

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

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

2 个答案:

答案 0 :(得分: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值确实为空。如果Port是一个文本字段,它可能包含空字符串,空格或非打印字符......任何这些字符都难以通过目视检查与Null区分开来。您可以对每个表运行简单查询以进行检查。

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

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

答案 1 :(得分:1)

这是我提出的问题的解决方案。在测试了不同的场景之后,我发现我从查询中得到了预期的结果。这是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));

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