Access select where 数据库查询 多表联合查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Access select where 数据库查询 多表联合查询相关的知识,希望对你有一定的参考价值。

Access中现有两个表Table1,Table2
Table1数据结构如下
---------------------------
id pid
---------------------------
1 23
2 14,23
3 4
4 2,5,6
......
---------------------------

Table2数据结构如下
---------------------------
pid name
---------------------------
1 abc
2 defghijk
3 lmnop
4 def
......
---------------------------
现需要找出Table1中所有pid 对应的name 含 某个字符串 的数据id
如查找"def", Table2对应满足条件的pid 有2,4;需要查询的Table1中的数据集就有3,4两条,第1,2条包含对应数值但不符合精确查找pid,需排除。

已经尝试可以使用以下语句查询到Table1.pid 只有单项的数据, 如上例中只有第3项
select id from table1 where pid in (select cint(pid) from table2 where name like '%def%')
但Table1.pid 有多项(使用逗号隔开)的数据无法查询,如例中无第4项
使用ASP(不是asp.net)+Access 如何写sql可以实现, 求解
多谢1楼的回答,经尝试,有以下问题需解决后实现
1,不能用||连接,like里要用+
2,字段变量不能在单引号内
3, 要对所有pid Cstr() 类型转换,仅限本例
最终效果如下
select a.id from table1 as a join table2 as b where (( a.pid = Cstr(b.pid) or a.pid like '%,'+Cstr(b.pid) or a.pid like '%,'+Cstr(b.pid)+',%' or a.pid like Cstr(b.pid)+',%') and b.name like '%def%')

参考技术A 试试 select a.id from table1 as a join table2 as b where ( a.pid = b.pid or a.pid like '%,||b.pid or a.pid like '%,||b.pid||,%' or a.pid like b.pid||,%') and b.name like '%def%')本回答被提问者和网友采纳

如何合并具有不同 WHERE 子句的两个 SELECT 查询

【中文标题】如何合并具有不同 WHERE 子句的两个 SELECT 查询【英文标题】:How do I merge two SELECT queries with different WHERE clauses 【发布时间】:2021-07-25 23:18:41 【问题描述】:

我正在尝试使用不同的 WHERE 子句并使用 GROUP BY 对两个不同的选择编写查询。 我浏览了示例,但我的示例不同,因为我有多个 SELECT 字段。 这是示例数据:

--    drop table #temp_counts;
create table #temp_counts(
report_date smalldatetime not null, 
Emp_id varchar(10) not null,
source_system varchar(10) not null
)

Insert into #temp_counts values ('2021-05-02 00:00:00', '12411', 'ABC');
Insert into #temp_counts values ('2021-05-02 00:00:00', '56421', 'ABC');
Insert into #temp_counts values ('2021-05-02 00:00:00', '45411', 'ABC');
Insert into #temp_counts values ('2021-05-02 00:00:00', '75411', 'ABC');
Insert into #temp_counts values ('2021-05-02 00:00:00', '13245', 'XYZ');
Insert into #temp_counts values ('2021-05-02 00:00:00', '66245', 'XYZ');
Insert into #temp_counts values ('2021-05-02 00:00:00', '77245', 'XYZ');
Insert into #temp_counts values ('2021-05-02 00:00:00', '98245', 'XYZ');
Insert into #temp_counts values ('2021-05-02 00:00:00', '34245', 'XYZ');
Insert into #temp_counts values ('2021-05-02 00:00:00', '29245', 'XYZ');

Insert into #temp_counts values ('2021-05-03 00:00:00', '14524', 'ABC');
Insert into #temp_counts values ('2021-05-03 00:00:00', '17824', 'ABC');
Insert into #temp_counts values ('2021-05-03 00:00:00', '32524', 'ABC');
Insert into #temp_counts values ('2021-05-03 00:00:00', '16724', 'XYZ');
Insert into #temp_counts values ('2021-05-03 00:00:00', '19924', 'XYZ');
Insert into #temp_counts values ('2021-05-03 00:00:00', '89424', 'XYZ');
Insert into #temp_counts values ('2021-05-03 00:00:00', '48324', 'XYZ');
Insert into #temp_counts values ('2021-05-03 00:00:00', '16000', 'XYZ');

Insert into #temp_counts values ('2021-05-04 00:00:00', '18724', 'ABC');
Insert into #temp_counts values ('2021-05-04 00:00:00', '12904', 'XYZ');

Insert into #temp_counts values ('2021-05-05 00:00:00', '12074', 'ABC');
Insert into #temp_counts values ('2021-05-05 00:00:00', '12784', 'XYZ');
Insert into #temp_counts values ('2021-05-05 00:00:00', '12324', 'XYZ');
Insert into #temp_counts values ('2021-05-05 00:00:00', '75124', 'XYZ');

这些是我想合并的查询:

select count(*) emp_count,  report_date , 'ABC' source_system from #temp_counts 
where  source_system = 'ABC'
group by report_date
order by report_date

select count(*) emp_count,  report_date , 'XYZ' source_system from #temp_counts 
where  source_system = 'XYZ'
group by report_date
order by report_date

我尝试了以下两种方法:

--Method 1
select fir.emp_count, fir.report_date, fir.source_system from
(select count(*) emp_count,  report_date , 'ABC' source_system from #temp_counts 
where  source_system = 'ABC') as fir
inner join
(select count(*) emp_count,  report_date , 'XYZ' source_system from #temp_counts 
where  source_system = 'XYZ') as sec
on fir.report_date = sec.report_date
group by fir.report_date
order by fir.report_date
--Method 2
select count(*) emp_count,  report_date , 'ABC' source_system from #temp_counts 
where  source_system = 'ABC'
UNION ALL
select count(*) emp_count,  report_date , 'XYZ' source_system from #temp_counts 
where  source_system = 'XYZ'
group by report_date
order by report_date

两者都报错:

Msg 8120, Level 16, State 1, Line 61
Column '#temp_counts.report_date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

请指导

【问题讨论】:

你的预期输出是什么? 用您正在使用的数据库标记您的问题。 【参考方案1】:

您似乎只想按 report_date 和 source_system 分组:

select count(*) emp_count,  report_date , source_system 
FROM #temp_counts
group by report_date, source_system
order by source_system,report_date

如果您想获得特定源系统的结果,那么您可以组合条件:

select count(*) emp_count,  report_date , source_system 
FROM #temp_counts 
where  source_system in ('ABC', 'XYZ')
group by report_date, source_system
order by source_system,report_date

您可以更改 order by 以按您想要显示的顺序显示行

只是为了说明如何使用联合:

select count(*) emp_count,  report_date , source_system from #temp_counts 
where  source_system = 'ABC'
group by report_date

union all

select count(*) emp_count,  report_date , source_system from #temp_counts 
where  source_system = 'XYZ'
group by report_date
order by source_system, report_date

【讨论】:

我仍然想知道使用 UNION 或 UNION ALL 的解决方案

以上是关于Access select where 数据库查询 多表联合查询的主要内容,如果未能解决你的问题,请参考以下文章

将 12 个具有不同“where”条件的 MS Access 查询组合到一个查询中

access 数据库 添加序号语句

MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢

MS Access 查询 WHERE NOT EXISTS

基于 Access 中保存的 SELECT 查询的 UPDATE 查询?

在access中用vba如何把SQL语句查询到的一个值赋给变量?