【发布时间】:2016-12-22 08:36:00
【问题描述】:
我有以下两张表:
表 1
id name
---------
A3 B2
A3 B400
A5 B100
A7 B200
A8 B6
A8 B2
A8 B3
和Table2
id name company
-------------------
A1 company1
A2 company2
A3 B1 company3
A4 company4
A5 B2 company5
A6 company6
A7 B3 company7
A8 B4 company8
A9 company9
A10 B6 company10
我正在启动三个查询来获得我想要的,但是有三个查询。我的问题是如何在一个查询中以更有效的方式完成所有这些操作?
查询 1:
SELECT DISTINCT t1.id as ID,
t2.company as Company,
'FOUND' AS status
FROM table1 t1
JOIN table2 t2
ON t1.id = t2.id
group by ID
查询 1 个结果:
ID Company Status
-----------------------
A3 company3 FOUND
A5 company5 FOUND
A7 company7 FOUND
A8 company8 FOUND
查询 2:
SELECT DISTINCT t2.id as ID,
t2.company as Company,
'FOUND' AS status
FROM table1 t1
JOIN table2 t2
ON t1.name = t2.name
group by ID
查询 2 结果:
ID Company Status
-----------------------
A5 company5 FOUND
A10 company10 FOUND
A7 company7 FOUND
查询 3:
SELECT t1.name as ID,
t1.name as Company,
'NOT FOUND' AS status
FROM table1 t1
WHERE t1.name NOT IN (SELECT t2.name
FROM table2 t2)
GROUP BY ID
查询 3 结果:
ID Company Status
-----------------------
B400 B400 NOT FOUND
B100 B100 NOT FOUND
B200 B200 NOT FOUND
最终结果输出如下:
ID Company Status
---------------------------
A3 company3 FOUND
A5 company5 FOUND
A7 company7 FOUND
A8 company8 FOUND
A10 company10 FOUND
B100 B100 NOT FOUND
B200 B200 NOT FOUND
B400 B400 NOT FOUND
注意:A5 和 A7 出现在第一个查询结果和第二个查询结果中!所以我们只需要保留一个。
如果需要一些解释:
我们从 table1 中获取唯一的ids 列表,并从 table2 中获取它们对应的 company。我们对 table1 的第二列进行类似的查询:我们从 table1 的第二列中查找第二列的值,即name,在 的第二列中查找>table2,如果我们找到它,那么我们会从 table2 中得到对应的 id 和 company,但如果 id 在我们之前的查询中已经存在,那么我们放弃它,无需重复它。第三,如果我们在 table2 的name 中没有找到 table1 的name 的值,那么我们就没有对应的id也不是company,因此我们将name 的值同时归为id 和company。一般来说,如果我们在 table2 的 table1 中找到 ids 和 names,那么我们给它们状态 FOUND 如果没有,那么 @987654348 @。
提前致谢
顺便说一下,我用union试了两次,但是查询时间长,效率不高。
【问题讨论】:
-
你的意思是只有标题应该是大写字母吗?还是别的什么?
-
@GiorgosBetsos 确切地说,因为我们找不到任何对应的 ID 或公司,所以我们将该名称归于该名称,即 B100 既作为 ID 又作为公司。