【问题标题】:SQL Query with a subquery带有子查询的 SQL 查询
【发布时间】:2012-05-17 16:49:27
【问题描述】:

我需要检索与 6 或 7 号玩家居住在同一街道和城镇的所有玩家的玩家编号、姓名、街道和城镇;

我不知道如何编写 SQL 查询,我想我需要在 WHERE 子句中有一个子查询,但不知道该怎么做。

这是我想出的,但我目前无法测试它

SELECT playerNo, name, street, town
FROM Players
WHERE street IN ( SELECT street, playerNo
                  FROM Players
                  WHERE playerNo IN (6,7));
AND town IN (SELECT town, playerNo
             FROM Players
             WHERE playerNo IN (6,7));

应该兼容Oracle 10g

感谢所有回复的人!

【问题讨论】:

标签: sql oracle subquery


【解决方案1】:

您没有说明您的 DBMS,所以这是 ANSI SQL 解决方案(适用于 Oracle、PostgreSQL、DB2、Teradata、MySQL 以及可能还有很多其他解决方案):

SELECT playerNo, name, street, town
FROM Players
WHERE (street, town) IN (SELECT street, town
                         FROM Players
                         WHERE playerNo IN (6,7));

关于IN 运算符的旁注:

您的表达式town IN (SELECT town, playerNO ... 无效,因为子选择必须与IN 运算符左侧的列数完全相同。在你的情况下,你必须写town IN (SELECT town FROM ...)

【讨论】:

    【解决方案2】:

    这样的事情应该可以解决问题:

    select t.playerNumber, t.name, t.street, t.town
    from tablename t
    inner join (select street, town from tablename where playerNumber in (6,7)) aux on aux.street = t.street and aux.town = t.town
    

    【讨论】:

    • 这对我来说真的很奇怪。为什么你把 where 放在 join 里面? O_o
    • “内部”选择获得玩家 6 和 7 的街道和城镇。“外部”选择获得在“内部”选择中给出的街道和城镇的信息。它可以解决问题,但就像你说的那样,可以用更简单的方式:)
    【解决方案3】:
    SELECT p1.playerNo, p1.name, p1.street, p1.town
    FROM Players AS p1
    INNER JOIN Players AS p2 ON p2.street = p1.street AND p2.town = p1.town
    WHERE p2.playerNo IN (6,7)
    

    通常最好避免子查询,因为数据库优化器无法“看到括号内部”。

    【讨论】:

    • 这也是一个不错的解决方案(尽管我并不完全相信 Oracle “看不到括号内”)。
    • 谢谢。 Oracle 可能比许多其他数据库更聪明。我知道我经常通过重构子查询来加快其他系统的速度。大多数情况下,更重要的是要在一个月内阅读。
    猜你喜欢
    • 2018-05-31
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多