Mysql 比较两个表,如果值存在,则显示1,如果值不存在';不存在显示0
SQL架构:Mysql 比较两个表,如果值存在,则显示1,如果值不存在';不存在显示0,mysql,sql,database,Mysql,Sql,Database,SQL架构: CREATE TABLE SNMASTER ( SERIAL_NUMBER varchar(50), WORK_ORDER int(5), ASSY_ID int(3) ); CREATE TABLE TRANSACTIONS ( SERIAL_NUMBER varchar(50), OPERATION_ID int(5), CREATED_ON DATETIME ); INSERT INTO SNMASTER VALUES('0910A40
CREATE TABLE SNMASTER (
SERIAL_NUMBER varchar(50),
WORK_ORDER int(5),
ASSY_ID int(3)
);
CREATE TABLE TRANSACTIONS (
SERIAL_NUMBER varchar(50),
OPERATION_ID int(5),
CREATED_ON DATETIME
);
INSERT INTO SNMASTER VALUES('0910A40877',56794,841);
INSERT INTO SNMASTER VALUES('0910A40886',56794,841);
INSERT INTO SNMASTER VALUES('0910A40895',56794,841);
INSERT INTO SNMASTER VALUES('0910A40902',56794,841);
INSERT INTO SNMASTER VALUES('0910A40911',56794,841);
INSERT INTO SNMASTER VALUES('0910A40920',88545,841);
INSERT INTO SNMASTER VALUES('0910A40939',88545,841);
INSERT INTO SNMASTER VALUES('0910A40948',88545,841);
INSERT INTO SNMASTER VALUES('0910A40957',97846,842);
INSERT INTO SNMASTER VALUES('0910A40966',97846,842);
INSERT INTO TRANSACTIONS VALUES('0910A40886',113,'2020-02-27 13:39:46');
INSERT INTO TRANSACTIONS VALUES('0910A40877',116,'2020-02-27 13:39:48');
INSERT INTO TRANSACTIONS VALUES('0910A40886',116,'2020-02-27 13:40:03');
INSERT INTO TRANSACTIONS VALUES('0910A40939',113,'2020-02-27 13:40:20');
INSERT INTO TRANSACTIONS VALUES('0910A40886',160,'2020-02-27 13:40:48');
我需要我的结果显示如下:
SERIAL_NUMBER 113 116 160
0910A40877 0 1 0
0910A40886 1 1 1
0910A40895 0 0 0
0910A40902 0 0 0
0910A40911 0 0 0
结果似乎显示了表SNMASTER中的前5行
然后它查看表事务,并在有操作ID时写入1,您可以使用
exists
:
select sm.*,
(exists (select 1
from transactions t
where t.serial_number = sm.serial_number and t.operation_id = 113
)
) as has_113,
(exists (select 1
from transactions t
where t.serial_number = sm.serial_number and t.operation_id = 116
)
) as has_116,
(exists (select 1
from transactions t
where t.serial_number = sm.serial_number and t.operation_id = 160
)
) as has_160
from snmaster sm;
使用事务索引(序列号、操作id)
,这可能是最快的方法
在MySQL中,
存在
返回一个布尔值。数据库将1
视为true,将0
视为false,这就是为什么这会满足您的要求。在其他数据库中,您需要将exists
封装在大小写
表达式中。这是MySQL语法,而不是SQL Server或Oracle。只使用您真正使用的数据库。考虑应用程序代码中的数据显示问题,这些方法非常接近这些表。我喜欢。非常感谢。我如何将查询限制为只显示MySQL中的前5名?我不知道您是如何识别“top”的。但是您可以使用orderbylimit 5
。好的,看起来MySQL使用了语法:“limit(number)”。我特别指的是从顶部开始的前5行。再次感谢你。
select a.SERIAL_NUMBER,
sum(case when b.OPERATION_ID = 113 then 1 else 0 end) as '113',
sum(case when b.OPERATION_ID = 116 then 1 else 0 end) as '116',
sum(case when b.OPERATION_ID = 160 then 1 else 0 end) as '160'
from SNMASTER a
left outer join TRANSACTIONS b on (a.SERIAL_NUMBER = b.SERIAL_NUMBER)
group by a.SERIAL_NUMBER