【发布时间】:2015-09-18 13:58:11
【问题描述】:
我正在学习“Learn SQL the hard way”,目前正在进行练习 13。
我被困在我们必须要做的部分
编写一个查询,可以找到所有宠物及其主人的名字 在 2004 年之后购买。关键是根据 宠物和父母的购买列。
我的桌子是这样的
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 在 cmets 中询问的那样,in 一直被覆盖到现在。
【问题讨论】:
-
joinit topersontable -
除了加入@vkp之外还有什么其他方式吗?
-
您需要使用连接。这是一篇很好的文章来解释它们。 blog.codinghorror.com/a-visual-explanation-of-sql-joins/… 此外,您的表中的数据类型确实很差。您不应该使用文本,因为它自 sql server 2005 以来已被弃用,而支持 varchar(max)。但是对于名称,您应该找到一个合理的长度。此外,float 数据类型是一种近似数据类型,当您需要精确的精度时可能不应该使用。您应该改用数字。
-
请只标记涉及的产品。 (MS SQL Server 和 SQLite 不完全兼容。)
-
@SeanLange 感谢您的意见。现在浏览博客。