不匹配的访问查询以检查多个文本

Unmatched Access Query to check multiple text

所以我有数据字段列,其中有多个供应商名称,这些名称由分号分隔,销售给定产品,我想确认它们与供应商 table 中的供应商名称相匹配。如果产品 table 中只有一个供应商,则以下访问查询可以满足我的需要,但当我有多个供应商并用分号分隔时,它就会分崩离析。有没有一种方法可以修改此处的语法以在多个供应商出现时对其进行检查?示例如下:"Vendor A; Vendor B; Vendor C" 产品 table 和供应商 table 供应商字段的同一记录中的所有供应商 A、B 和 C 是单独的记录。

SELECT [Product_Table].[Product Name]
FROM [Product_Table] LEFT JOIN [Vendor_Table] ON [Product_Table].[Vendor] = [Vendor_Table].[Vendor]
WHERE ((([Vendor_Table].Vendor) Is Null));

您可以尝试使用 inSTR 函数而不是 = 函数吗?

SELECT [Product_Table].[Product Name]
FROM [Product_Table] LEFT JOIN [Vendor_Table] 
ON inSTR([Vendor_Table].[Vendor], [Product_Table].[Vendor]) > 0
WHERE ((([Vendor_Table].Vendor) Is Null));

我可能会帮助你,或者至少给你一个起点。

此致,

有办法做到这一点,但需要创建一些辅助对象。

将此查询创建为 qryNumberList_:

SELECT DISTINCT MSysObjects.Id
FROM            MSysObjects;

(此查询从 MSysObject table 中提取唯一对象 ID。在 Access 2007 中的全新数据库中,此 returns 34 行。这将在以后很重要。)

将此查询创建为 qryNumberList:

SELECT  DCount("*","qryNumberList_","[Id] < " & [Id]) AS [Number]
FROM    qryNumberList_
WHERE   DCount("*","qryNumberList_","[Id] < " & [Id]) <= DMax("Len([Vendor])-Len(Replace([Vendor],';',''))","Product_Table", '[Vendor] Is Not Null');

(此查询根据上一个查询的 Id 创建一个从 0 开始的顺序数字列表。)

在 public 模块中创建此函数:

Public Function Split_(ByVal v As Variant, ByVal d As String, ByVal p As Integer) As Variant
    Split_ = Trim(Split(Nz(v, ""), d)(p))
End Function

(这只是Split的包装函数,不能在查询中调用。)

设置完成后,将此 SQL 复制到新查询中,然后 运行 它:

SELECT  Product_Table.[Product Name], Split_([Vendor],";",[Number]) AS SplitVendor
FROM    Product_Table, qryNumberList
WHERE   (((qryNumberList.Number)<=Len([Vendor])-Len(Replace([Vendor],";",""))));

这段代码所做的是创建一个连续的数字列表,然后将它与该列表进行交叉连接。 Split_ 函数提取出字符串中由数字表示的部分。因此 Product_Table 中的数据看起来像:

[Product Name] [Vendor]
My Product     Vendor A;Vendor B;Vendor C

结果是:

[Product Name] [SplitVendor]
My Product     Vendor A
My Product     Vendor B
My Product     Vendor C

这里真正的陷阱是您将只能 return 字符串中在 qryNumberList_ 中具有相同或更少不同行的部分。幸运的是,这应该至少为 34(请参阅有关 qryNumberList_ 的注释)。我尝试以一种不创建另一个持久性 table 的方式来执行此操作,因此没有限制。

我已经尽力解释清楚了,但我现在很累。试试吧,看看它是否能满足您的需求。

编辑:糟糕,我提供的测试数据的第二个数据有一个逗号分隔符。应该是;.

编辑 2:更改 qryNumberList 以将 Product_Table 中供应商列中的行数限制为最大分隔符。