【发布时间】:2020-08-20 20:31:23
【问题描述】:
我有一个销售人员和一个客户表,我正在尝试查找居住在客户居住的任何城市的所有销售人员(请注意,客户与特定的销售人员相关联,但现在我们只是比较城市)
创建表(ORACLE)
CREATE TABLE SALESMAN (
SALESMAN_ID INT CONSTRAINT SALESMAN_PK PRIMARY KEY,
NAME VARCHAR2(15),
CITY VARCHAR2(10),
COMMISSION DECIMAL(4,2))
;
INSERT ALL
INTO SALESMAN VALUES(5001,'JAMES HOOG','NEW YORK',0.15)
INTO SALESMAN VALUES(5002,'NAIL KNITE','PARIS',0.13)
INTO SALESMAN VALUES(5005,'PIT ALEX','LONDON',0.11)
INTO SALESMAN VALUES(5006,'MC LYON','PARIS',0.14)
INTO SALESMAN VALUES(5003,'LAUSON HEN','SAN JOSE',0.12)
INTO SALESMAN VALUES(5007,'PAUL ADAM','ROME',0.13)
SELECT * FROM DUAL
;
CREATE TABLE CUSTOMER (
CUSTOMER_ID INT CONSTRAINT CUSTOMER_PK PRIMARY KEY,
CUST_NAME VARCHAR2(15),
CITY VARCHAR(10),
GRADE INT,
SALESMAN_ID INT,
CONSTRAINT FK_CUSTOMER_SALESMAN
FOREIGN KEY (SALESMAN_ID) REFERENCES SALESMAN (SALESMAN_ID))
;
INSERT ALL
INTO CUSTOMER VALUES (3002, 'NICK RIMANDO', 'NEW YORK', 100, 5001)
INTO CUSTOMER VALUES (3007, 'BRAD DAVIS', 'NEW YORK', 200, 5001)
INTO CUSTOMER VALUES (3005, 'GRAHAM ZUSI', 'CALIFORNIA', 200,5002)
INTO CUSTOMER VALUES (3008, 'JULIAN GREEN', 'LONDON', 300,5002)
INTO CUSTOMER VALUES (3004, 'FABIAN JOHSON', 'PARIS',300,5006)
INTO CUSTOMER VALUES (3009, 'GEOFF CAMEROON', 'BERLIN', 100,5003)
INTO CUSTOMER VALUES (3003, 'JOZY ALTIDOR', 'MOSCOW', 200,5007)
INTO CUSTOMER VALUES (3001, 'BRAD GUZAN', 'LONDON',NULL,5005)
SELECT * FROM DUAL
;
SELECT * FROM SALESMAN;
SALESMAN_ID NAME CITY COMMISSION
5001 JAMES HOOG NEW YORK .15
5002 NAIL KNITE PARIS .13
5005 PIT ALEX LONDON .11
5006 MC LYON PARIS .14
5003 LAUSON HEN SAN JOSE .12
5007 PAUL ADAM ROME .13
SELECT * FROM CUSTOMER;
CUSTOMER_ID CUST_NAME CITY GRADE SALESMAN_ID
3002 NICK RIMANDO NEW YORK 100 5001
3007 BRAD DAVIS NEW YORK 200 5001
3005 GRAHAM ZUSI CALIFORNIA 200 5002
3008 JULIAN GREEN LONDON 300 5002
3004 FABIAN JOHSON PARIS 300 5006
3009 GEOFF CAMEROON BERLIN 100 5003
3003 JOZY ALTIDOR MOSCOW 200 5007
3001 BRAD GUZAN LONDON - 5005
# EXPECTED OUTPUT
SALESMAN_ID NAME CITY COMMISSION
5001 JAMES HOOG NEW YORK .15
5006 MC LYON PARIS .14
5005 PIT ALEX LONDON .11
5002 NAIL KNITE PARIS .13
# QUERY 1
SELECT DISTINCT
SLS.*
FROM SALESMAN SLS, CUSTOMER CUST
WHERE SLS.CITY = CUST.CITY
# QUERY 2
SELECT * FROM SALESMAN SLS
WHERE EXISTS (SELECT SALESMAN_ID FROM CUSTOMER WHERE SLS.CITY = CUSTOMER.CITY)
# QUERY 3
SELECT * FROM SALESMAN SLS
WHERE SLS.SALESMAN_ID IN (SELECT DISTINCT CUST.SALESMAN_ID FROM CUSTOMER CUST WHERE SLS.CITY = CUST.CITY)
;
# OUTPUT FROM QUERY 3
SALESMAN_ID NAME CITY COMMISSION
5001 JAMES HOOG NEW YORK .15
5006 MC LYON PARIS .14
5005 PIT ALEX LONDON .11
在上述三个查询中,查询 1 和 2 给出了预期的输出,但是查询 3 没有提供预期的输出。所有查询在 salesman 和 customer 表中的 city 之间都有相同的连接,但我不明白为什么查询 3 会给出不同的输出。
【问题讨论】:
标签: sql oracle join subquery aggregate