Sql 我试图理解以下问题之间的区别

Sql 我试图理解以下问题之间的区别,sql,oracle,join,subquery,aggregate,Sql,Oracle,Join,Subquery,Aggregate,我有一个salesperson和一个customer表,我试图找到居住在某个客户居住的任何城市的所有销售人员(请注意,该客户与某个特定的销售人员关联,但目前我们只是比较该城市) 创建表(ORACLE) 在上述三个查询中,查询1和查询2提供了预期的输出,而查询3没有提供预期的输出。所有查询在city from Saleser和customer表之间都有相同的联接,但我不明白为什么查询3会给出不同的输出。在第三个查询中,您缺少联接,您希望与第二个查询的工作方式相同。这是您对join的第三个查询 SE

我有一个salesperson和一个customer表,我试图找到居住在某个客户居住的任何城市的所有销售人员(请注意,该客户与某个特定的销售人员关联,但目前我们只是比较该城市)

创建表(ORACLE)


在上述三个查询中,查询1和查询2提供了预期的输出,而查询3没有提供预期的输出。所有查询在city from Saleser和customer表之间都有相同的联接,但我不明白为什么查询3会给出不同的输出。

在第三个查询中,您缺少联接,您希望与第二个查询的工作方式相同。这是您对
join
的第三个查询

SELECT * FROM SALESMAN SLS  
WHERE SLS.SALESMAN_ID 
IN  (
      SELECT 
        DISTINCT CUST.SALESMAN_ID 
      FROM CUSTOMER CUST 
      JOIN SALESMAN_ID SLS
      ON SLS.CITY = CUST.CITY
    )

当子查询结果非常大时,
EXISTS
比IN快得多,当子查询结果非常小时,
IN
EXISTS
快得多。

在第三个查询中,您缺少了
join
,您希望与第二个查询一样工作。这是您对
join
的第三个查询

SELECT * FROM SALESMAN SLS  
WHERE SLS.SALESMAN_ID 
IN  (
      SELECT 
        DISTINCT CUST.SALESMAN_ID 
      FROM CUSTOMER CUST 
      JOIN SALESMAN_ID SLS
      ON SLS.CITY = CUST.CITY
    )

当子查询结果非常大时,
EXISTS
比IN快得多,当子查询结果非常小时,
IN
EXISTS
快得多。

更新

根据注释,第三个查询的正确形式应该只检查customer表中是否存在任何销售人员所在的城市:

SELECT * FROM SALESMAN SLS  
WHERE SLS.CITY IN  (SELECT DISTINCT CITY FROM CUSTOMER CUST)
这将给出与前两个查询相同的结果

原始答案

第三个查询给出不同结果的原因是子查询仅返回
customer
中存在的
saller
中每个城市的saller id值,在本例中为5001、5005和5006。因此,你不会在产品中得到指甲针,因为巴黎、伦敦或纽约的客户都没有销售过指甲针

<>请注意,查询3实际上返回正确的结果是有争议的,因为您的其他查询不考虑给定的销售人员是否在任何给定的城市都有客户。因此,您的另外两个查询应该是:

问题1:

SELECT DISTINCT
SLS.*
FROM SALESMAN SLS
JOIN CUSTOMER CUST ON SLS.CITY = CUST.CITY AND SLS.SALESMAN_ID = CUST.SALESMAN_ID
ORDER BY SLS.SALESMAN_ID
问题2:

SELECT * FROM SALESMAN SLS  
WHERE EXISTS (SELECT * FROM CUSTOMER WHERE SLS.CITY = CUSTOMER.CITY AND CUSTOMER.SALESMAN_ID = SLS.SALESMAN_ID)
ORDER BY SALESMAN_ID
通过这些更改,所有三个查询都会得到相同的结果:

SALESMAN_ID     NAME        CITY        COMMISSION
5001            JAMES HOOG  NEW YORK    .15
5005            PIT ALEX    LONDON      .11
5006            MC LYON     PARIS       .14

更新

根据注释,第三个查询的正确形式应该只检查customer表中是否存在任何销售人员所在的城市:

SELECT * FROM SALESMAN SLS  
WHERE SLS.CITY IN  (SELECT DISTINCT CITY FROM CUSTOMER CUST)
这将给出与前两个查询相同的结果

原始答案

第三个查询给出不同结果的原因是子查询仅返回
customer
中存在的
saller
中每个城市的saller id值,在本例中为5001、5005和5006。因此,你不会在产品中得到指甲针,因为巴黎、伦敦或纽约的客户都没有销售过指甲针

<>请注意,查询3实际上返回正确的结果是有争议的,因为您的其他查询不考虑给定的销售人员是否在任何给定的城市都有客户。因此,您的另外两个查询应该是:

问题1:

SELECT DISTINCT
SLS.*
FROM SALESMAN SLS
JOIN CUSTOMER CUST ON SLS.CITY = CUST.CITY AND SLS.SALESMAN_ID = CUST.SALESMAN_ID
ORDER BY SLS.SALESMAN_ID
问题2:

SELECT * FROM SALESMAN SLS  
WHERE EXISTS (SELECT * FROM CUSTOMER WHERE SLS.CITY = CUSTOMER.CITY AND CUSTOMER.SALESMAN_ID = SLS.SALESMAN_ID)
ORDER BY SALESMAN_ID
通过这些更改,所有三个查询都会得到相同的结果:

SALESMAN_ID     NAME        CITY        COMMISSION
5001            JAMES HOOG  NEW YORK    .15
5005            PIT ALEX    LONDON      .11
5006            MC LYON     PARIS       .14

Nick,谢谢你的回复。。关于您建议对查询1和查询2进行的修改,我明白了,但我并不想实现这一点。。换句话说,如果任何客户与销售人员居住在同一城市,我希望提供所有销售人员信息。。因此,我期待查询1和查询2给出的输出。。对于查询3,我假设它通常复制客户和销售人员与城市的内部联接。在这种情况下,我的假设是查询应该找到销售员5002,因为我们有一个住在巴黎的客户。。如果我遗漏了什么,请告诉我。@siva好的,这就更清楚了。在这种情况下,您的第三个查询无法工作,因为它对saller_id和city(而不仅仅是city)进行有效连接。请参阅我的编辑,以获得一个查询,该查询将按照您在评论中的解释执行。尼克,谢谢您的建议。。不知道为什么我没有想到:)顺便说一句,原来的第三个查询只有城市的连接,对吗?子查询是否意味着连接也与saller_id一起发生?我询问第三个查询的主要原因是我想知道查询的实际情况。原始的第三个查询也有效地与saller\u id连接,因为您在中使用
saller\u id(选择saller\u id…
)-这就是为什么我的新查询只在中使用
city(选择city…
Nick,谢谢你的答复。。关于您建议对查询1和查询2进行的修改,我明白了,但我并不想实现这一点。。换句话说,如果任何客户与销售人员居住在同一城市,我希望提供所有销售人员信息。。因此,我期待查询1和查询2给出的输出。。对于查询3,我假设它通常复制客户和销售人员与城市的内部联接。在这种情况下,我的假设是查询应该找到销售员5002,因为我们有一个住在巴黎的客户。。如果我遗漏了什么,请告诉我。@siva好的,这就更清楚了。在这种情况下,您的第三个查询无法工作,因为它对saller_id和city(而不仅仅是city)进行有效连接。请参阅我的编辑,以获得一个查询,该查询将按照您在评论中的解释执行。尼克,谢谢您的建议。。不知道为什么我没有想到:)顺便说一句,原来的第三个查询只有城市的连接,对吗?子查询是否意味着连接也与saller_id一起发生?我询问第三个查询的主要原因是我想知道查询的实际情况。原始的第三个查询也有效地与saller\u id连接,因为您在(选择s)中使用了
saller\u id