我可以使用 'like' 与另一个 table 中的字段进行比较吗?
Can I use 'like' to compare to a field in another table?
我有两个表 - tMasks
和 tFiles
,每个表都有一个(相关)字段 - 分别为 [mask]
和 [filename]
。
示例数据和预期结果
对于 tMasks
,我们有 [mask]
个值 '60moelg'
、'adjclmrp'
和 'arerrdoc'
。
对于 tfiles
,我们有 [filename]
个值 '60moelg_00'
、'aut_cnty'
、'exvndata00'
和 'adjclmrp00'
。
我需要列出 tFiles
中的所有 [filename]
值,其中 tMasks
中没有匹配的 [mask]
值。 (所以在我这里非常有限的样本中,结果将是 {'aut_cnty', 'exvndata00'}
。)
我试过的
我正在尝试以下方法:
SELECT FileName
FROM tFiles
WHERE FileName not in (SELECT FileName from tFiles, tMasks where FileName like ('mask' & '%'));
但这不起作用,因为
SELECT FileName from tFiles, tMasks WHERE FileName LIKE ('mask' & '%')
returns 一个空集,所以 not in
不会消除任何东西。
我是否需要将这些列导入 VBA 数组变体并通过 for..each 循环执行此操作 'brute force',或者这是我可以用 SELECT 做的事情吗?它似乎应该是我可以用 SELECT 做的事情,但我只是没有做出飞跃....
(在'real world'中,tMasks
是300条以下记录,而tFiles
是1400多条记录,最终的重点是更新(和维护!)tMasks
这样就没有 tFiles
的成员在 tMasks
中没有匹配的掩码。为了让它更 'interesting',我不能使用 'equals' 'like',因为掩码中的字符数不一致。有些掩码有 8 个字符,有些有 7 个,有些只有 6 个。所以我不能只使用 Left(filename, n)
比较掩码=
运算符,因为 n
会有所不同。)
我被卡住了 - 有什么建议吗?提前致谢!
删除 'mask' 中的引号。您不需要掩码的 STRING,您想要掩码的 VALUE。我还将 & 更改为 +,因为我的 SQL 服务器 (2012) 不允许将 & 用于 nvarchar 数据类型。
SELECT FileName FROM tFiles
WHERE FileName not in
(SELECT FileName from tFiles, tMasks where FileName like (mask + '%'));
我在我的数据库中设置了你描述的场景,它返回了两行:
FileName
aut_cnty
exvndata00
祝你好运!
我有两个表 - tMasks
和 tFiles
,每个表都有一个(相关)字段 - 分别为 [mask]
和 [filename]
。
示例数据和预期结果
对于 tMasks
,我们有 [mask]
个值 '60moelg'
、'adjclmrp'
和 'arerrdoc'
。
对于 tfiles
,我们有 [filename]
个值 '60moelg_00'
、'aut_cnty'
、'exvndata00'
和 'adjclmrp00'
。
我需要列出 tFiles
中的所有 [filename]
值,其中 tMasks
中没有匹配的 [mask]
值。 (所以在我这里非常有限的样本中,结果将是 {'aut_cnty', 'exvndata00'}
。)
我试过的
我正在尝试以下方法:
SELECT FileName
FROM tFiles
WHERE FileName not in (SELECT FileName from tFiles, tMasks where FileName like ('mask' & '%'));
但这不起作用,因为
SELECT FileName from tFiles, tMasks WHERE FileName LIKE ('mask' & '%')
returns 一个空集,所以 not in
不会消除任何东西。
我是否需要将这些列导入 VBA 数组变体并通过 for..each 循环执行此操作 'brute force',或者这是我可以用 SELECT 做的事情吗?它似乎应该是我可以用 SELECT 做的事情,但我只是没有做出飞跃....
(在'real world'中,tMasks
是300条以下记录,而tFiles
是1400多条记录,最终的重点是更新(和维护!)tMasks
这样就没有 tFiles
的成员在 tMasks
中没有匹配的掩码。为了让它更 'interesting',我不能使用 'equals' 'like',因为掩码中的字符数不一致。有些掩码有 8 个字符,有些有 7 个,有些只有 6 个。所以我不能只使用 Left(filename, n)
比较掩码=
运算符,因为 n
会有所不同。)
我被卡住了 - 有什么建议吗?提前致谢!
删除 'mask' 中的引号。您不需要掩码的 STRING,您想要掩码的 VALUE。我还将 & 更改为 +,因为我的 SQL 服务器 (2012) 不允许将 & 用于 nvarchar 数据类型。
SELECT FileName FROM tFiles
WHERE FileName not in
(SELECT FileName from tFiles, tMasks where FileName like (mask + '%'));
我在我的数据库中设置了你描述的场景,它返回了两行:
FileName
aut_cnty
exvndata00
祝你好运!