搜索“正如我之前提到的,使用表别名的主要原因之一”
问题:为什么这个人在“同一个”表(一个表)上使用子查询?我理解这是为了避免歧义,但不能将查询改为:
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');
答案 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')
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 |