我正在经历“艰苦学习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_id
和pet_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';
(当您需要从同一个表中获取多个列(例如,名字和姓氏)时,效率不如联接。)