[英]SQL: Select everything in a table not in a sub-query?
该查询似乎运行良好:
-- Every supplier that produces some red or green part
SELECT Suppliers.sid
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid = Catalog.sid
AND Catalog.pid = Parts.pid
AND (Parts.color = "red" OR Parts.color = "green");
为了进行检查,我想查看该查询不会返回的每个SID,以确保它们不会产生绿色或红色部分。 我怎样才能做到这一点?
这似乎不起作用:
SELECT Parts.color
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid NOT IN (
SELECT Suppliers.sid, Parts.color
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid = Catalog.sid
AND Catalog.pid = Parts.pid
AND (Parts.color = "red" OR Parts.color = "green")
);
MySQL错误:
错误1241(21000):操作数应包含1列
解决这个问题的正确方法是什么?
这是用于创建正在使用的表的SQL:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb`;
-- -----------------------------------------------------
-- Table `mydb`.`Suppliers`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Suppliers` (
`sid` INT NOT NULL ,
`sname` VARCHAR(45) NULL ,
`address` VARCHAR(45) NULL ,
PRIMARY KEY (`sid`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Parts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Parts` (
`pid` INT NOT NULL ,
`pname` VARCHAR(45) NULL ,
`color` VARCHAR(45) NULL ,
PRIMARY KEY (`pid`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Catalog`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Catalog` (
`cost` INT NULL ,
`pid` INT NOT NULL ,
`sid` INT NOT NULL ,
PRIMARY KEY (`pid`, `sid`) ,
INDEX `fk_Catalog_Parts1` (`pid` ASC) ,
INDEX `fk_Catalog_Suppliers1` (`sid` ASC) ,
CONSTRAINT `fk_Catalog_Parts1`
FOREIGN KEY (`pid` )
REFERENCES `mydb`.`Parts` (`pid` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Catalog_Suppliers1`
FOREIGN KEY (`sid` )
REFERENCES `mydb`.`Suppliers` (`sid` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
不能完全知道您的意思,但我发现有几处错误。 首先删除子查询中的第二列,这是不必要的:
SELECT Parts.color
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid NOT IN (
SELECT Suppliers.sid FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid = Catalog.sid
AND Catalog.pid = Parts.pid
AND (Parts.color = "red" OR Parts.color = "green")
);
最后,您似乎有一个交叉连接,我想您不想这样做。 这是为什么不应该使用隐式联接的经典示例。 看看是否可以更好地工作:
SELECT Parts.color
FROM Suppliers
JOIN Catalog on Suppliers.sid = Catalog.sid
JOIN Parts on Catalog.pid = Parts.pid
WHERE Suppliers.sid NOT IN (
SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog on Suppliers.sid = Catalog.sid
JOIN Parts on Catalog.pid = Parts.pid
WHERE (Parts.color = "red" OR Parts.color = "green")
);
更改您的子查询以返回一列。
旧子查询
SELECT Suppliers.sid, Parts.color
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid = Catalog.sid
AND Catalog.pid = Parts.pid
AND (Parts.color = "red" OR Parts.color = "green"
新子查询
SELECT Suppliers.sid
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid = Catalog.sid
AND Catalog.pid = Parts.pid
AND (Parts.color = "red" OR Parts.color = "green"
内部选择仅需要返回ID
删除: , Parts.color
SELECT Parts.color
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid NOT IN (
SELECT Suppliers.sid
FROM Suppliers, Catalog, Parts
WHERE Suppliers.sid = Catalog.sid
AND Catalog.pid = Parts.pid
AND (Parts.color = "red" OR Parts.color = "green")
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.