无与伦比的访问查询以检查多个文本

时间:2015-03-01 18:24:37

标签: sql ms-access

所以我的数据字段列有多个供应商名称,这些名称由分号分隔,销售给定产品,我想确认它们与供应商表中的供应商名称相匹配。如果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));

2 个答案:

答案 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列中的行数到最大分隔符。