SQL:一个查询中包含两个select语句

71
我可以帮您翻译成中文。

我想在一个查询中从两个SQL表格中选择信息,这些信息没有关联,所以不存在任何潜在的连接。

以下是一个示例设置:

tblMadrid

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

tblBarcelona

   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

我尝试按照这个逻辑进行:单个查询中的多个选择语句,但以下代码不起作用:
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 

这个有什么建议吗?谢谢。 信息:足球的例子只是一个简单化的示例。实际上,不能将两个表格合并成一个并创建一个新的“团队”列。这两个表格具有完全不同的结构,但我需要一些与此示例特征相匹配的东西。

10个回答

110

10
请记住,如果您使用UNION,则需要在两个SELECT中使用相同的表名,否则将会抛出错误。 - Dexter

34

如果您喜欢保持记录分开,而不是做联合,请尝试以下查询

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

14
这里的“DUAL”是什么?它似乎是一个虚拟表,对吗? - М.Б.
1
@М.Б. 请查看 https://forums.mysql.com/read.php?10,69223,69226#msg-69226 - Tom Davies

8

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;

6
只要列匹配,您就可以联合查询。
SELECT name,
       games,
       goals
FROM   tblMadrid
WHERE  id = 1
UNION ALL
SELECT name,
       games,
       goals
FROM   tblBarcelona
WHERE  id = 2 

4
您可以像这样将两个表的数据组合起来,按照最高得分排序,然后选择前两个: MySQL
select *
from (
  select * from tblMadrid
  union all
  select * from tblBarcelona
) alldata
order by goals desc
limit 0,2;

SQL Server

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

If you only want Messi and Ronaldo

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

为确保梅西排在前面,您可以这样做:
select * from (
  select * from tblBarcelona where name = 'messi'
  union all
  select * from tblMadrid where name = 'ronaldo'
) stars
order by name;

我认为OP想要的顺序是目标。 - Juan Carlos Oropeza
1
到目前为止,这是解决问题的最准确方法。 - Alex Vergara

2
select name, games, goals
from tblMadrid where name = 'ronaldo'
union
select name, games, goals
from tblBarcelona where name = 'messi'
ORDER  BY goals 

同时,使用UNION ALL通常更快,因为它不会尝试去除重复项。 - Sami Kuhmonen

1
使用联合查询可以在这种情况下有所帮助。
您还可以在始终返回 true 的条件上使用 join,而与这些表中的数据无关。请参见下面的内容。
select tmd .name,tbc.goals from tblMadrid tmd join tblBarcelona tbc on 1=1;

即使表格没有共同的列,join也能帮助您。


0

我看你想要每个团队中最多的进球数,你可以尝试这个:

从 tblRealMadrid 表中选择名称、比赛和最多进球数作为“最多进球数”,然后联合查询 tblBarcelona 表中的名称、比赛和最多进球数。


0
在您的情况下,这两个表具有完全不同的结构,无法进行连接。
可以使用 UNION 运算符。UNION 运算符将两个或多个 SELECT 语句的结果连接起来生成单个结果集。SELECT 语句中的第一列用于对结果集进行排序。
SELECT name, games, goals
FROM tblMadrid
WHERE name = 'ronaldo'
UNION
SELECT name, games, goals
FROM tblBarcelona
WHERE name = 'messi'
ORDER BY goals;

每个SELECT语句必须具有相同数量的列和兼容的数据类型。此外,如果您想保留重复项,请使用UNION ALL而不是UNION。

0
你可以在这种情况下使用UNION。
select id, name, games, goals from tblMadrid
union
select id, name, games, goals from tblBarcelona

你只需要在两个 SQL 中保持选定列的顺序,即 id、name、games、goals。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接