我有一个复杂的查询,我一直在努力。我尝试过几种不同的方式。什么都行不通。它失败或消耗太多内存和错误。
基本上,我有
Table1
-F1
-F2
-F3
-F4
-F5
-F6
-F7
-F8
Table2
-F1
-F2
-F3
-F4
-F5
我需要从Table1获取F1 + F2 + F3 + F4 + F5的连接值,并确保在表2的F1 + F2 + F3 + F4 + F5的连接值中没有匹配,其中Table1.F6 + Table1.F7<> 'xxxxx'和Table1.F8为空。
但是这里有问题...... 我也在同一个查询中,需要确保不仅没有满足第一个条件,而且需要确保其他3个条件,其中在某些地方的表1的连接值中有星号。文字星号,而不是通配符。
因此,假设我们将5个字段连接到每个表中名为TEMP的列中。我需要这个:
Table1.TEMP <> Table2.TEMP
AND LEFT(Table1.TEMP,8) + "**" + Right(Table1.TEMP,2) <> Table2.TEMP
AND LEFT(Table1.TEMP,9) + "**" + Right(Table1.TEMP,1) <> Table2.TEMP
AND LEFT(Table1.TEMP,9) + "***" <> Table2.TEMP
WHERE Table1.F6+Table1.F7 <> "xxxxx" AND Table1.F8 is empty
当满足这些条件时,我需要update Table1.F9 = "x"
我尝试使用左连接(访问查询构建器中的不匹配查询),使用4个左连接的OR语句来执行此操作。这些表有数十万行,它正在杀死我的机器。我已经尝试了各种其他的sql语句,并由于内存不足而导致错误。我已经尝试了一个双记录集循环,它将一直运行到时间结束。我没有想法。我有6个类似的查询需要写。
更新:这是我尝试过的查询之一。语法是正确的,但将永远运行:
UPDATE TABLE1 LEFT JOIN TABLE2
ON TABLE1.TEMP = TABLE2.TEMP
OR LEFT(TABLE1.TEMP,8) + "**" + Right(TABLE1.TEMP,2) = TABLE2.TEMP
OR LEFT(TABLE1.TEMP,9) + "**" + Right(TABLE1.TEMP,1) = TABLE2.TEMP
OR LEFT(TABLE1.TEMP,9) + "***" = TABLE2.TEMP
SET TABLE1.F9 = "X"
WHERE TABLE2.TEMP IS NULL
AND TABLE1.F9 IS NULL
AND TABLE1.F7 + TABLE1.F8 = "XXXXX";
我点击“运行”并在底部显示“运行查询”。但是40分钟后,状态栏根本没有填满。
更新2.我将其重写为SELECT语句,并且仅使用top join语句(删除了以下3),并生成28k行。有没有办法,使用嵌套的SQL语句搜索那些28k的第二个不匹配的语句,依此类推?我不太熟悉复杂的SQL语句。我想知道是否有办法分解它而不是在JOIN语句中执行3 OR?我试图在连接中添加第一个OR语句。所以我在JOIN子句中有2个语句。那就把它杀死了。它锁定了访问权限。这只是一个OR。所以它无法处理JOIN子句中的OR。