【问题标题】:SQL: Two select statements in one querySQL:一个查询中有两个选择语句
【发布时间】:2015-11-05 21:02:29
【问题描述】:

我想在一个查询中从两个 SQL 表中选择信息,但是这些信息是不相关的,所以不存在潜在的接头。

一个示例可能是以下设置。

tbl马德里

   id | name    | games | goals
    1 | ronaldo | 100   | 100
    2 | benzema | 50    | 25
    3 | bale    | 75    | 50
    4 | kroos   | 80    | 10

tbl巴塞罗那

   id | name    | games | goals
    1 | neymar  | 60    | 25
    2 | messi   | 150   | 200
    3 | suarez  | 80    | 80
    4 | iniesta | 40    | 5

我想要一个能提供以下信息的查询:

name    | games | goals
messi   | 150   | 200
ronaldo | 100   | 100

我试图遵循这个逻辑:Multiple select statements in Single query 但下面的代码不起作用:

USE Liga_BBVA

SELECT (SELECT name,
               games,
               goals
        FROM   tblMadrid
        WHERE  name = 'ronaldo') AS table_a,
       (SELECT name,
               games,
               goals
        FROM   tblBarcelona
        WHERE  name = 'messi')   AS table_b
ORDER  BY goals 

对这个有什么建议吗?谢谢 信息:足球的东西只是一个简化的例子。实际上,不可能将两个表合二为一并拥有一个新的“团队”列。这两个表有完全不同的结构,但我需要一些符合这个例子的特点。

【问题讨论】:

    标签: sql select


    【解决方案1】:

    你可以这样做:

     (SELECT
        name, games, goals
        FROM tblMadrid WHERE name = 'ronaldo')
     UNION
     (SELECT
        name, games, goals
        FROM tblBarcelona WHERE name = 'messi')
    ORDER BY goals;
    

    参见,例如:https://dev.mysql.com/doc/refman/5.0/en/union.html

    【讨论】:

    • 请注意,如果你使用UNION,你需要在SELECT中使用相同的tableName,否则会抛出错误。
    【解决方案2】:

    如果您想将记录分开而不是合并。
    试试下面的查询

    SELECT (SELECT name,
                   games,
                   goals
            FROM   tblMadrid
            WHERE  name = 'ronaldo') AS table_a,
           (SELECT name,
                   games,
                   goals
            FROM   tblBarcelona
            WHERE  name = 'messi')   AS table_b
    FROM DUAL
    

    【讨论】:

    【解决方案3】:

    在这种情况下使用联合会有所帮助。

    您还可以在始终返回 true 且与这些表中的数据无关的条件上使用连接。见下文

    select tmd .name,tbc.goals from tblMadrid tmd join tblBarcelona tbc on 1=1;

    【讨论】:

    • 即使在表没有公共列的情况下,join 也会为您提供帮助
    【解决方案4】:
    select name, games, goals
    from tblMadrid where name = 'ronaldo'
    union
    select name, games, goals
    from tblBarcelona where name = 'messi'
    ORDER  BY goals 
    

    【讨论】:

    • 另外使用UNION ALL 通常更快,因为它不会尝试删除重复项。
    【解决方案5】:

    只要列匹配,您就可以合并查询。

    SELECT name,
           games,
           goals
    FROM   tblMadrid
    WHERE  id = 1
    UNION ALL
    SELECT name,
           games,
           goals
    FROM   tblBarcelona
    WHERE  id = 2 
    

    【讨论】:

      【解决方案6】:

      在这种情况下你可以使用 UNION

      select id, name, games, goals from tblMadrid
      union
      select id, name, games, goals from tblBarcelona
      

      你只需要在两个 SQL 中维护所选列的顺序,即 id、name、games、goals

      【讨论】:

        【解决方案7】:

        UNION 语句是你的朋友:

        SELECT   a.playername, a.games, a.goals
        FROM     tblMadrid as a
        WHERE    a.playername = "ronaldo"
        UNION
        SELECT   b.playername, b.games, b.goals
        FROM     tblBarcelona as b
        WHERE    b.playername = "messi"
        ORDER BY goals;
        

        【讨论】:

          【解决方案8】:

          您可以合并两个表中的数据,按目标最高的顺序排列,然后选择前两个,如下所示:

          MySQL

          select *
          from (
            select * from tblMadrid
            union all
            select * from tblBarcelona
          ) alldata
          order by goals desc
          limit 0,2;
          

          SQL 服务器

          select top 2 *
          from (
            select * from tblMadrid
            union all
            select * from tblBarcelona
          ) alldata
          order by goals desc;
          

          如果你只想要梅西和罗纳尔多

          select * from tblBarcelona where name = 'messi'
          union all
          select * from tblMadrid where name = 'ronaldo'
          

          要确保 messi 位于结果的顶部,您可以执行以下操作:

          select * from (
            select * from tblBarcelona where name = 'messi'
            union all
            select * from tblMadrid where name = 'ronaldo'
          ) stars
          order by name;
          

          【讨论】:

          • 我认为 OP 想要的顺序是目标。
          • 到目前为止,这是解决问题的最准确的方法。
          猜你喜欢
          • 2022-01-09
          • 2013-03-01
          • 1970-01-01
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多