首页 > 解决方案 > 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的数据,我也会获取两者 的数据。这是为什么?怎么了?ClienteCliente

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;

查询结果 查询结果

标签: mysqlsqldatabasemariadb

解决方案


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

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-2017


推荐阅读