【问题标题】:MS Access 07 - wildcard in JOIN queryMS Access 07 - JOIN 查询中的通配符
【发布时间】:2012-10-29 19:24:37
【问题描述】:

我有以下查询

SELECT tblUsers.userfullname, 
       tblReports.reportdate, 
       tblReports.reportnumber, 
       tblRawData.reportcategory, 
       tblRawData.reportissue
FROM tblRawData 
RIGHT JOIN (tblUsers RIGHT JOIN tblReports ON tblUsers.userID = tblReports.userID) ON tblReports.reportnumber LIKE "*" & tblRawData.reportnum
WHERE (
       ((tblUsers.username) Like "*" & [Forms]![frmSelect]![txtUser] & "*") 
       AND
       ((tblUsers.userShift) Like "*" & [Forms]![frmSelect]![txtShift] & "*")
      );

哪个有效 - 除了

的部分
ON tblReports.reportnumber LIKE "*" & tblRawData.reportnum

我要匹配的是实例

tblReports.reportnumber = 410145

tblRawData.reportnum = 12345.410145

或者只是

tblRawDatw.reportnum = 410145

但由于某种原因,它不会找到第一个匹配项(例如:12345.410145),除非该数字与第二个匹配项相同(例如:410145)。我尝试将其格式化为数字和文本 - 没有运气。

知道我可能缺少什么吗?

更新:我尝试只使用这两个表进行另一个查询,但它不喜欢匹配。我尝试删除“。” (例如:12345.410145 转换为 12345410145)并且没有运气。这是我的第二个查询。

SELECT tblReports.userID, 
tblRawData.reportnum,
tblRawData.reportcategory,
tblRawData.reportissue,
tblReports.reportdate,
tblReports.reportnumber
FROM tblReports
LEFT JOIN tblRawData ON tblReports.reportnumber LIKE "*" & tblRawData.reportnum;

如果数据是这样的。

tblReports 报告编号: 410145 410144 410143 410142 410141

和 tblRawData 报告编号是这样的: 12345.410145 410143 12344.410141

结果查询应该显示来自 tblReports 的所有 5 条记录 - 但其中 3 条记录具有来自 tblRawData 的注释等。

【问题讨论】:

    标签: join ms-access-2007


    【解决方案1】:

    重写以允许不匹配。

    SELECT 
       u.userfullname, 
       r.reportdate, 
       r.reportnumber, 
       q.reportcategory, 
       q.reportissue
    FROM (tblusers u 
    LEFT JOIN tblreports r 
    ON u.userid = r.userid) 
    LEFT JOIN (
       SELECT 
          Val(Mid([reportnum],InStr([reportnum],".")+1)) AS RepNo, 
          r.reportcategory, 
          r.reportissue
       FROM Rawdata AS r)  AS q
    ON r.reportnumber = q.RepNo
    AND q.username  Like "*" & [Forms]![frmSelect]![txtUser] & "*"
    AND q.userShift Like "*" & [Forms]![frmSelect]![txtShift] & "*"
    

    使用 LEFT JOIN 而不是 RIGHT JOIN 是一种非常常见的约定。

    【讨论】:

    • 抱歉耽搁了 - 被飓风桑迪耽搁了。因为这不走运,它给了我所有匹配的原始数据记录,而没有来自原始数据中不存在的报告的所有记录 - 原始数据匹配似乎也忽略了通配符。
    • 没有匹配的记录需要包含为Or d.reportnumber Is Null我会在通配符上回复你。 (我希望你和你的安全,并保持安全)
    • 好吧,比赛的方式不对。那是(tblRawData.reportnum) 12345.410145 LIKE (reportnumber) * & 410145
    • 不走运,我试过 d.reportnum Is Null 和 r.reportnumber Is Null 都一样
    • 好的,我发布了一个完全不同的方法。它可能很慢。
    【解决方案2】:

    我没有检查所有内容,但我有一些想法。也许你必须交换 LIKE 条件?

    tblRawData.reportnum LIKE "*" & tblReports.reportnumber
    

    如果这不是问题,您可以尝试使用trim 函数吗?

    Trim(tblReports.reportnumber) LIKE "*" & Trim(tblRawData.reportnum)
    

    【讨论】:

      【解决方案3】:

      SQL 查询的通配符是百分号“%”而不是星号。尝试使用它。但是,如果您包含所有匹配项,那么为什么要在查询中包含它呢?

      Access wildcard character reference

      【讨论】:

      • ANSI-89 是类型 - 所以它是 *。我不明白你关于包括每场比赛的问题。
      • 我的意思是,如果你包含所有匹配项,为什么它在你的 where 子句中?举个更简单的例子:select * from table where i like '*' 你不需要 where 子句。
      • 如果没有更多解释,恐怕这个答案不适合 MS Access。使用默认 ANSI 设置在 MS Access 中工作时的通配符是 *,在 Access 外部使用 Jet/ACE 引擎和 ADO 或在 MS Access (ANSI92) 内部使用 SQL Server 兼容设置时,通配符是 %。 Chasester 似乎在 MS Access 内部工作,所以通配符确实是 *.
      • 是的,“*”似乎可以在 MS Access 中使用。很抱歉造成混乱。
      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多