sql:为什么在这个实例中需要子查询才有一个表?

时间:2014-09-11 18:34:19

标签: sql

http://books.google.com/books?id=IkBxyCMqwI8C&pg=PA126&lpg=PA126&dq=%22As+I+mentioned+earlier,+one+of+the+primary+reasons+to+use+table%22&source=bl&ots=99Jq7v1MVv&sig=XbjdrjSwKntQJ5nVifHJr1lYxjc&hl=en&sa=X&ei=6OIRVNDVFaKsjAKmnoHwBg&ved=0CB4Q6AEwAA#v=onepage&q=%22As%20I%20mentioned%20earlier%2C%20one%20of%20the%20primary%20reasons%20to%20use%20table%22&f=false

搜索“正如我之前提到的,使用表别名的主要原因之一”

问题:为什么这个人在“同一个”表(一个表)上使用子查询?我理解这是为了避免歧义,但不能将查询改为:

Select cust_id, cust_name, cust_contact
From customers
Where cust_contact ='Jim Jones';

我认为客户联系= jim jones的客户,他们也恰好在吉姆琼斯工作的地方工作。

今天早上,我试图寻找源代码。但它似乎没有。

这本书的代码是

Select cust_id, cust_name, cust_contact
From customers
Where cust_name = (select cust_name  from customers where cust_contact = 'jim jones');

3 个答案:

答案 0 :(得分:2)

子查询的原因是有多个记录与'cust_name'具有相同的jim jones。本书中的示例使用"cust_name"表示公司,而不是个人

也许更好的例子是:

SELECT * from Cars
WHERE make = (SELECT make FROM Cars where Model = "Explorer")

这将选择所有" Fords"没有明确地拥有"福特"在查询中。

答案 1 :(得分:1)

结果可能不同。如果有两个名为“john doe”的客户,并且其中只有一个拥有名为“jim jones”的联系人,那么您的查询将只返回该客户,而该书中的查询将返回所有具有相同名称的客户

我怀疑这是否是您想要的结果,但肯定存在差异。

如果cust_name是唯一字段,则两个查询的结果都相同,在这种情况下,子选择会增加不必要的复杂性。

{edit}我还没有读过这本书,但现在我看到它实际上也是它作为示例输出显示的内容,所以这个行为是有意的。在书中加入指出这种差异,并且实际上正在努力实现自我联接的下一个例子,您可以使用它来实现类似的结果。无论哪种方式都与您更简单的查询不同,后者只返回对联系人有“jim jones”的确切客户。

答案 2 :(得分:0)

就像我说的那样,这些查询不一样.....但是这本书有错误......我建议使用IN而不是=以防万一一个与吉姆琼斯联系......或者你会得到:

Subquery returns more than 1 row: Select cust_id, cust_name, cust_contact From customers Where cust_name = (select cust_name from customers where cust_contact = 'jim jones')

SQL Fiddle

MySQL 5.5.32架构设置

CREATE TABLE customers
    (`cust_id` int, `cust_name` varchar(7), `cust_contact` varchar(9))
;

INSERT INTO customers
    (`cust_id`, `cust_name`, `cust_contact`)
VALUES
    (10003, 'Fun4All', 'Jim Jones'),
    (10004, 'Fun4All', 'Denise'),
    (10005, 'Fun4you', 'Jim Jones'),
    (10006, 'Fun4you', 'Claude'),
    (10007, 'Fun4me', 'Pierre')
;

查询1

Select cust_id, cust_name, cust_contact
From customers
Where cust_contact ='Jim Jones'

<强> Results

| CUST_ID | CUST_NAME | CUST_CONTACT |
|---------|-----------|--------------|
|   10003 |   Fun4All |    Jim Jones |
|   10005 |   Fun4you |    Jim Jones |

查询2

Select cust_id, cust_name, cust_contact
From customers
Where cust_name in 
       (select cust_name from customers where cust_contact = 'jim jones')

<强> Results

| CUST_ID | CUST_NAME | CUST_CONTACT |
|---------|-----------|--------------|
|   10003 |   Fun4All |    Jim Jones |
|   10004 |   Fun4All |       Denise |
|   10005 |   Fun4you |    Jim Jones |
|   10006 |   Fun4you |       Claude |