Access SQL - 从Table1中选择行,其中Table2中的任何列都不同

时间:2016-05-24 11:01:09

标签: sql ms-access

我正在尝试找到一种更有效的方法来执行查询:

从Table1中选择所有行,其中相同设计的Table2(在另一个数据库中)中的任何列都不同。 此查询将用于UPDATE查询,以使用Table2中的任何更改来更新Table1。

我现在的做法是:

SELECT T1.* 

FROM Table1 T1 LEFT JOIN (SELECT * FROM Table2 IN 'FilePath') T2 ON 
T1.ID = T2.ID

WHERE 
T1.Column1 <> T2.Column1 OR
T1.Column2 <> T2.Column2 OR
...
T1.Column67 <> T2.Column67

现在这可以工作,但在67列(约40秒 - 1分钟)上可以理解的速度很慢 - 而这个选择查询将是每天更新Table1的结果查询

因此,如果有一种非常简单的方法可以让我忽视这一点,我会很感激一些见解

2 个答案:

答案 0 :(得分:1)

UNION可用于Access中的The shortest, fastest, and easiest way to compare two tables...

SELECT Table1.*
FROM Table1
INNER JOIN (
  SELECT DISTINCT ID
  FROM (
    SELECT * FROM Table1
    UNION ALL                                 --< Have identical records duplicated
    SELECT * FROM Table2
  ) Combined
  GROUP BY ID, Column1, Column2, ... Column67 --< Compare significant columns
  HAVING COUNT(*) = 1                         --< Take unique records only
) Different ON Table1.ID = Different.ID;

请注意:由于@ HansUp已指出Microsoft Access文档规定GROUP BY Clause中最多只能使用10个字段。虽然我发现Access 2016中所有68列都没有分组问题,但请注意,这显然是一个无证的功能,必须谨慎使用。

答案 1 :(得分:0)

将所有字段连接在一起可能更有效,然后进行单一比较。

这个VBA应该为你提供一个或多或少可行的SQL:

Dim id, i As Integer
Dim idList(5)
For Each selectedItem As DataGridViewRow In qstSets.SelectedRows
    'show ids of multiple selected rows
    id = selectedItem.Cells("ID").Value
    idList(i) = id
    i += 1
Next selectedItem
Dim sResult As String = ""
For Each elem As String In idList
    sResult &= elem & ", "
Next
MsgBox(sResult)