使用选择的结果来分配多个条件
假设我有一个与平民的虚拟数据库。每一行都包含他们的名字,城市,街道,街道号码和工作。一个最小的示例来生成SQLite的数据库:
import sqlite3
from pathlib import Path
def main():
build_cmd = """CREATE TABLE civs (
name TEXT,
city TEXT,
street TEXT,
snumber INTEGER,
job TEXT) """
pdb = Path("dummy.db")
if pdb.exists():
pdb.unlink()
conn = sqlite3.connect(str("dummy.db"))
cur = conn.cursor()
cur.execute(build_cmd)
insert_cmds = """
BEGIN TRANSACTION;
INSERT INTO civs VALUES ('john', 'dublin', 'butchers_street', '42', 'butcher');
INSERT INTO civs VALUES ('marie', 'london', 'butchers_street', '3', 'baker');
INSERT INTO civs VALUES ('keith', 'london', 'camel_road', '7', 'carpenter');
INSERT INTO civs VALUES ('anna', 'dublin', 'butchers_street', '9', 'butcher');
INSERT INTO civs VALUES ('steve', 'london', 'maceys_alley', '1', 'blacksmith');
INSERT INTO civs VALUES ('beth', 'dublin', 'butchers_street', '68', 'grocer');
INSERT INTO civs VALUES ('lisa', 'dublin', 'church_street', '32', 'nun');
COMMIT;
"""
cur.executescript(insert_cmds)
cur.close()
conn.commit()
conn.close()
if __name__ == '__main__':
main()
现在,我想检索所有生活在同一城市和街道上的人,例如John
。当我只想检查Street
时,我可以这样工作:
SELECT civs.name, civs.city, civs.street
FROM
civs
WHERE
street = (
SELECT street
FROM civs
WHERE
name = 'john'
)
但是,这当然还将返回居住在伦敦而不是都柏林的玛丽。
名称 | City | Street |
---|---|---|
Marie | London | Butchers_street |
John | Dublin | Butchers_street |
Beth | Dublin | Butchers_street |
Anna | Dublin | Butchers_street |
,所以我尝试了以下内容,以下内容不起作用:
SELECT civs.name, civs.city, civs.street
FROM
civs
WHERE
street, city = (
SELECT street, city
FROM civs
WHERE
name = 'john'
)
以下是有效的,但是它不是很干。有更好的方法吗?
SELECT civs.name, civs.city, civs.street
FROM
civs
WHERE
street = (
SELECT street
FROM civs
WHERE
name = 'john'
)
AND city = (
SELECT city
FROM civs
WHERE
name = 'john'
)
注意 :效率对我很重要。您可以假设它是一个冷表,并且所有列都是索引的。
Let's say I have a dummy database with civilians. Every row contains their name, city, street, street number, and job. A minimal example to generate a database in SQLite:
import sqlite3
from pathlib import Path
def main():
build_cmd = """CREATE TABLE civs (
name TEXT,
city TEXT,
street TEXT,
snumber INTEGER,
job TEXT) """
pdb = Path("dummy.db")
if pdb.exists():
pdb.unlink()
conn = sqlite3.connect(str("dummy.db"))
cur = conn.cursor()
cur.execute(build_cmd)
insert_cmds = """
BEGIN TRANSACTION;
INSERT INTO civs VALUES ('john', 'dublin', 'butchers_street', '42', 'butcher');
INSERT INTO civs VALUES ('marie', 'london', 'butchers_street', '3', 'baker');
INSERT INTO civs VALUES ('keith', 'london', 'camel_road', '7', 'carpenter');
INSERT INTO civs VALUES ('anna', 'dublin', 'butchers_street', '9', 'butcher');
INSERT INTO civs VALUES ('steve', 'london', 'maceys_alley', '1', 'blacksmith');
INSERT INTO civs VALUES ('beth', 'dublin', 'butchers_street', '68', 'grocer');
INSERT INTO civs VALUES ('lisa', 'dublin', 'church_street', '32', 'nun');
COMMIT;
"""
cur.executescript(insert_cmds)
cur.close()
conn.commit()
conn.close()
if __name__ == '__main__':
main()
Now, I want to retrieve all the people that live in the same city and street as john
. When I just want to check for street
, I can make it work like this:
SELECT civs.name, civs.city, civs.street
FROM
civs
WHERE
street = (
SELECT street
FROM civs
WHERE
name = 'john'
)
But this of course will also return marie, who lives in London, not in Dublin.
name | city | street |
---|---|---|
marie | london | butchers_street |
john | dublin | butchers_street |
beth | dublin | butchers_street |
anna | dublin | butchers_street |
So I tried the following which does not work:
SELECT civs.name, civs.city, civs.street
FROM
civs
WHERE
street, city = (
SELECT street, city
FROM civs
WHERE
name = 'john'
)
The following does work, but it is not very DRY. Is there a better way?
SELECT civs.name, civs.city, civs.street
FROM
civs
WHERE
street = (
SELECT street
FROM civs
WHERE
name = 'john'
)
AND city = (
SELECT city
FROM civs
WHERE
name = 'john'
)
Note: efficiency is important for me. You can assume that it is a cold table and that all columns are indexed.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论