T-SQL 减号运算符

lea*_*gIT 6 sql-server sql-server-2014 except

这些是我创建并在其中插入值的表:

CREATE TABLE Customer
(Customer_No INTEGER IDENTITY (1,1) PRIMARY KEY,
 Customer_Name VARCHAR(30) NOT NULL
)

CREATE TABLE DVD
(DVD_No INTEGER IDENTITY (1,1) PRIMARY KEY,
 DVD_Name VARCHAR(30)
)

CREATE TABLE DVD_Purchase
(DVD_Purchase_No INTEGER IDENTITY (1,1) PRIMARY KEY,
 DVD_No INTEGER NOT NULL,
 Customer_No INTEGER NOT NULL
 )

INSERT INTO Customer (Customer_Name)
VALUES('Daman')
INSERT INTO Customer (Customer_Name)
VALUES('Saif')
INSERT INTO Customer (Customer_Name)
VALUES('Gurung')
INSERT INTO Customer (Customer_Name)
VALUES('Upendra')
INSERT INTO Customer (Customer_Name)
VALUES('Ornob')

INSERT INTO DVD (DVD_Name)
VALUES('Bleach')
INSERT INTO DVD (DVD_Name)
VALUES('Gintama')
INSERT INTO DVD (DVD_Name)
VALUES('Tokyo Ghoul')
INSERT INTO DVD (DVD_Name)
VALUES('Death Note')
INSERT INTO DVD (DVD_Name)
VALUES('Rurouni Kenshin')


INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (4,1)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (1,2)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (1,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (2,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (3,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (4,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (1,4)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (2,4)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (5,1)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (5,2)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (5,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (5,4)
Run Code Online (Sandbox Code Playgroud)

为了使用 MINUS 运算符显示未购买任何 DVD 的客户姓名,这是我尝试过的:

SELECT Customer_Name
FROM Customer
WHERE Customer_No 
IN
(SELECT Customer_No FROM Customer
 MINUS
 SELECT Customer_No FROM DVD_Purchase
)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

消息 156,级别 15,状态 1,第 123 行 关键字“SELECT”附近的语法不正确。消息 102,级别 15,状态 1,第 124 行 ')' 附近的语法不正确。

如错误消息中所示,')' 附近的语法不正确,我无法弄清楚。

除此之外,有人可以向我提供正确的查询吗?

ype*_*eᵀᴹ 12

MINUS 是仅由 Oracle 使用的“设置差异”运算符的名称。

SQL ServerEXCEPT为此运算符使用(标准)名称 , 。替换MINUSwithEXCEPT将解决问题:

SELECT Customer_Name
FROM Customer
WHERE Customer_No 
  IN
  (SELECT Customer_No FROM Customer
   EXCEPT
   SELECT Customer_No FROM DVD_Purchase
  ) ;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,由于外部查询和子查询引用了同一个表+列 ( Customer . Customer_No),因此您可以NOT IN不使用EXCEPT. 假设所涉及的列 ( Customer_No) 不可为空,这是等效的:

SELECT Customer_Name
FROM Customer
WHERE Customer_No 
  NOT IN
  (SELECT Customer_No FROM DVD_Purchase
  ) ;
Run Code Online (Sandbox Code Playgroud)