我有一个具有以下结构的mdb表:
我尝试使用查询列出结果集中行A和B的所有不同字段:
SELECT * From Table1
WHERE Field1 = 'A'
UNION
SELECT * From Table1
WHERE Field1 = 'B';
但是这个查询有两个问题:
列出所有字段,包括 相同的细胞,有一张大桌子
它也会发出错误消息: 定义了许多领域。
我怎么能解决这些问题?
答案 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)将有助于创建查询。