如何比较一个mdb表中的两行?

时间:2011-02-24 10:11:09

标签: sql ms-access

我有一个具有以下结构的mdb表:

  • Field1 Field2 Field3 Field4
  • A ......
  • B ......

我尝试使用查询列出结果集中行A和B的所有不同字段:

SELECT * From Table1
WHERE Field1 = 'A'
UNION 
SELECT * From Table1
WHERE Field1 = 'B';

但是这个查询有两个问题:

  1. 列出所有字段,包括 相同的细胞,有一张大桌子

  2. 它也会发出错误消息:     定义了许多领域。

  3. 我怎么能解决这些问题?

2 个答案:

答案 0 :(得分:1)

根据所需值的Field1值和组,选择表中所需的所有字段是不是最简单?

这样的事情:

SELECT field1, field2,...field195
FROM Table1
WHERE field1 = 'A' or field1 = 'B'
GROUP BY field1, field2, ....field195

这将为您提供field1为A或B的所有行,并且其中一个选定字段存在差异。

哦,对于group by语句和SELECT部分​​,确实使用前面提到的编辑模式进行查询。在那里,您可以添加结果中所需的所有字段(通过在表格中选择它们并将它们向下拖动),然后单击功能区中的“总计”按钮以为所有字段添加组依据。然后你只需要添加Where子句就可以了。


现在问题更清楚了(您希望查询根据特定要求选择字段而不是记录),我将不得不将答案更改为:

这是不可能的。 (直到另外证明);)

据我所知,查询用于选择使用例如where子句的记录,从不用于确定应根据某个标准显示哪些字段。


在这种情况下MIGHT帮助的一件事是查看数据库设计。这些桌子是否正确制作? 假设您有190个这些字段仅仅是主要数据的详细信息。您可以在另一个表中将其分开,因此您有一个主表和详细信息表。 详细信息表可能类似于:

 ID   ID_Main   Det_desc   Det_value

这样您可以使用以下内容过滤所有在两个主要值A和B之间相等的Detail值:

Select a.det_desc, a.det_value, b.det_value
(Select Det_desc, det_value
from tblDetails
where id_main = a) as A inner join
(Select Det_desc, det_value
from tblDetails
where id_main = a) as B
on A.det_desc = B.det_desc and A.det_value <> B.det_value

如果需要,您可以再次加入主表。

答案 1 :(得分:-1)

您可以自己full join表,匹配相同的行。然后,如果两个连接部分之一为null,则可以对不匹配进行过滤。例如:

select  *
from    (
        select  *
        from    Table1
        where   Field1 = 'A'
        ) A
full join
        (
        select  *
        from    Table1
        where   Field1 = 'B'
        ) B
on      A.Field2 = B.Field2
        and A.Field3 = B.Field3
where   A.Field1 is null 
        or B.Field1 is null

如果您有200个字段,请通过在设计视图中创建查询来请求Access生成列列表。切换到SQL视图并复制/粘贴。具有列模式的编辑器(如UltraEdit)将有助于创建查询。