mysql - Where 子句未按预期工作:仅指定一个时,我从 2 个不同的 ID 获取数据
问题描述
我有这个脚本:
CREATE TABLE `Usuario` (
`IDUsuario` INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`IDUsuario`)
);
CREATE TABLE `Cliente` (
`Cedula` VARCHAR(9) NOT NULL,
`FK_Usuario` INT NOT NULL,
PRIMARY KEY (`Cedula`, `FK_Usuario`)
);
CREATE TABLE `NotaCreditoDebito` (
`IDNota` BIGINT NOT NULL AUTO_INCREMENT,
`FK_Cliente` VARCHAR(9) NOT NULL,
`FK_Usuario` INT NOT NULL,
`NoNota` CHAR(2) NOT NULL,
`Tipo` CHAR(2) NOT NULL,
PRIMARY KEY (`IDNota`, `FK_Cliente`, `FK_Usuario`)
);
ALTER TABLE `Cliente` ADD FOREIGN KEY (`FK_Usuario`) REFERENCES `Usuario`(`IDUsuario`);
ALTER TABLE `NotaCreditoDebito` ADD FOREIGN KEY (`FK_Usuario`) REFERENCES `Usuario`(`IDUsuario`);
ALTER TABLE `NotaCreditoDebito` ADD FOREIGN KEY (`FK_Cliente`) REFERENCES `Cliente`(`Cedula`);
INSERT INTO Usuario VALUES();
/*Usuario 1 has 2 Clientes*/
INSERT INTO Cliente VALUES('000000000',1);
INSERT INTO Cliente VALUES('123456789',1);
/*Cliente 000000000 has 2 NotaCreditoDebito */
INSERT INTO NotaCreditoDebito VALUES(0,'000000000',1,'N1','01');
INSERT INTO NotaCreditoDebito VALUES(0,'000000000',1,'N2','02');
/*Cliente 123456789 has 1 NotaCreditoDebito */
INSERT INTO NotaCreditoDebito VALUES(0,'123456789',1,'N3','01');
当我执行以下查询时,即使我只想获取000000000的数据,我也会获取两者 的数据。这是为什么?怎么了?Cliente
Cliente
SELECT
NCD.IDNota,
NCD.FK_Cliente,
NCD.FK_Usuario,
NCD.NoNota,
NCD.Tipo
FROM NotaCreditoDebito NCD INNER JOIN Usuario U ON NCD.FK_Usuario=U.IDUsuario
INNER JOIN Cliente C ON NCD.FK_Cliente=C.Cedula
WHERE NCD.Tipo='01' OR NCD.Tipo='02' AND NCD.FK_Cliente='000000000' AND NCD.FK_Usuario=1;
解决方案
OR
的优先级低于AND
。几乎你在哪里
WHERE NCD.Tipo='01' OR (NCD.Tipo='02' AND NCD.FK_Cliente='000000000' AND NCD.FK_Usuario=1)
要解决此问题,请将括号括在您的OR
:
WHERE (NCD.Tipo='01' OR NCD.Tipo='02') AND NCD.FK_Cliente='000000000' AND NCD.FK_Usuario=1
推荐阅读
- java - File.delete 不删除文件
- reactjs - NextJS:如何在成功验证后将用户重定向到他们请求的页面?
- reactjs - React 仅渲染从 firebase 下载的列表中的一项
- flutter - 有什么方法可以检查用户是否收到了从 firebase 消息中收到的通知
- redis - 当一个渐进式 rehash 触发器时,redis 如何执行
- arrays - #!/usr/bin/perl,如何将字符串中的关键字与数字匹配
- html - html 属性中的大写字母
- .net - .Net Core API:没有路由匹配提供的值
- vba - ItemAdd 运行了几次然后停止工作,直到我重新启动 Outlook
- api - 如何从外部 JSON 文件中读取测试数据并与邮递员响应进行比较?