使用选择的结果来分配多个条件

发布于 2025-01-30 19:54:36 字数 2741 浏览 1 评论 0原文

假设我有一个与平民的虚拟数据库。每一行都包含他们的名字,城市,街道,街道号码和工作。一个最小的示例来生成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'
    )

但是,这当然还将返回居住在伦敦而不是都柏林的玛丽。

名称CityStreet
MarieLondonButchers_street
JohnDublinButchers_street
BethDublinButchers_street
AnnaDublinButchers_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.

namecitystreet
marielondonbutchers_street
johndublinbutchers_street
bethdublinbutchers_street
annadublinbutchers_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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文