我正在经历“艰苦学习SQL”,目前正在练习13。

我被困在必须要做的部分


编写查询,以查找所有宠物及其主人的名字
是2004年以后购买的。关键是要根据
宠物和父母的“ purchase_on”列。


我的桌子看起来像这样

sqlite> select * from person ;
id          first_name  last_name   age         dead        phone_number  salary      dob
----------  ----------  ----------  ----------  ----------  ------------  ----------  ----------
0           john        doe         20          0           9929          123123.0    2015-12-09
1           foo         bar         25          0           12            123123.0    2004-12-11
2           michal      jordan      19          0           12            123123.0    2005-12-11
3           tom         ford        30          0           12            123123.0    2002-12-11




sqlite> select * from pet ;
id          name        breed       age         dead        dob         parent_id
----------  ----------  ----------  ----------  ----------  ----------  ----------
0           fluffy      Unicorn     5           0           2012-02-01
1           quora       social net  10          0           2010-02-01
2           Goldie      German She  6           0           2009-02-01
3           boxer       golden ret  3           0           2007-02-01
4           naman       kutta       10          1           2011-02-01
5           hari        ohk         7           0           2015-02-01


sqlite> select * from person_pet ;
person_id   pet_id      purchased_on
----------  ----------  ------------
2           2           2002-03-30
2           3           2001-04-30
2           4           2005-04-30
2           5           2003-04-30
3           1           2006-04-30
3           4           2005-04-30


我的schema看起来像这样

sqlite> .schema
CREATE TABLE person(
 id INTEGER PRIMARY KEY,
 first_name TEXT,
 last_name TEXT,
 age INTEGER
, dead INTEGER, phone_number INTEGER, salary FLOAT, dob DATETIME);
CREATE TABLE pet(
 id INTEGER PRIMARY KEY,
 name TEXT,
 breed TEXT,
 age INTEGER,
 dead INTEGER
, dob DATETIME, parent_id INTEGER);
CREATE TABLE person_pet(
 person_id INTEGER,
 pet_id INTEGER
, purchased_on DATETIME);
CREATE TABLE cars(
 id INTEGER PRIMARY KEY,
 car_name TEXT
);


我尝试过的

我可以通过查询获得“ 2004”年之后带来的person_idpet_id

sqlite> select person_id, pet_id, purchased_on from person_pet
   ...> where purchased_on > "2004-01-01" ;
person_id   pet_id      purchased_on
----------  ----------  ------------
2           4           2005-04-30
3           1           2006-04-30
3           4           2005-04-30


我现在应该如何继续列出名字?

这是我第一次使用SQL,因此将不胜感激。被困了一段时间。

编辑:

我知道可以使用joins完成此操作,但是直到练习13才涉及到。如何在不使用joins的情况下做到这一点?

正如@vkp在评论中所要求的,到目前为止,in已被覆盖。

最佳答案

要将ID替换为其关联的名称,可以使用correlated subqueries

select (select first_name
        from person
        where id = person_pet.person_id),
       (select name
        from pet
        where id = person_pet.pet_id),
       purchased_on
from person_pet
where purchased_on >= '2005';


(当您需要从同一个表中获取多个列(例如,名字和姓氏)时,效率不如联接。)

10-01 11:38