簡體   English   中英

SQL:選擇表中的所有內容而不是子查詢中的所有內容?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM