所以我的数据字段列有多个供应商名称,这些名称由分号分隔,销售给定产品,我想确认它们与供应商表中的供应商名称相匹配。如果Product表中只有一个Vendor,但是当我有以分号分隔的倍数时,则会出现以下Access Query。有没有办法可以在这里修改语法来检查多个供应商何时出现?这样的示例是:“供应商A;供应商B;供应商C”全部在Product表中的Vendor字段的相同记录中,并且Vendor表供应商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));
答案 0 :(得分:1)
您可以尝试使用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));
我可能会帮助你或者至少给出一个起点。
此致
答案 1 :(得分:1)
有办法做到这一点,但需要创建一些辅助对象。
将此查询创建为qryNumberList _:
SELECT DISTINCT MSysObjects.Id
FROM MSysObjects;
(此查询从MSysObject表中提取唯一对象ID。在Access 2007中的一个全新的数据库中,这将返回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 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],";",""))));
这段代码正在做的是创建一个连续的数字列表,然后将CROSS加入到该列表中。 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
这里真正的问题是,您只能返回qryNumberList_中具有相同或更少不同行的字符串部分。幸运的是,这至少应该是34(请参阅有关qryNumberList_的说明)。我试图以一种你不创建另一个持久表的方式来做到这一点,从而限制了这一点。
我试图尽力解释,但此刻我已经累了。试试吧,看看它能不能得到你想要的东西。
编辑:哎呀,我提供的测试数据有第二个逗号分隔符。应该是;。
编辑2:更改qryNumberList以限制Product_Table中Vendor列中的行数到最大分隔符。