从多个表中选择没有连接?

时间:2012-08-23 15:27:26

标签: mysql

从两个表中选择数据而不是连接它们的最简单方法是什么,让它们显示为单独的行。两个表都有相似或匹配的字段,我想在它们上运行一些聚合函数,例如avg同一个月中发生的所有行,来自两个表。

例如,我有两个表,一个表示来自一个系统的事务,另一个表示来自不同系统的事务。有没有办法从两个表中获取所有事务作为单独的行?如果表1有20条记录而表2有30条记录,我希望返回时有50行。

9 个答案:

答案 0 :(得分:38)

您可以尝试这样的事情:

SELECT f1,f2,f3 FROM table1
UNION
SELECT f1,f2,f3 FROM table2

答案 1 :(得分:31)

UNION ALL运算符可能就是您要找的。

使用此运算符,您可以将多个查询的结果集连接在一起,从而保留每个查询的所有行。请注意,UNION运算符(不包含ALL关键字)将消除结果集中存在的任何“重复”行。 UNION ALL运算符会保留每个查询中的所有行(并且可能会执行得更好,因为它没有执行重复检查和删除操作的开销)。

每列的列数和数据类型必须在每个查询中匹配。如果其中一个查询的列数多于另一个查询,我们有时会在另一个查询中包含虚拟表达式,以使列和数据类型“匹配”。通常,在每个返回文字的查询的SELECT列表中包含一个表达式(一个额外的列)是有帮助的,以显示哪些查询是该行的“源”。

SELECT 'q1' AS source, a, b, c, d FROM t1 WHERE ...
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 JOIN t3 ON ...
UNION ALL
SELECT 'q3', '1', '2', buckle, my_shoe FROM t4

您可以在一组括号中包装这样的查询,并将其用作内联视图(或MySQL语言中的“派生表”),以便您可以对所有行执行聚合操作。

SELECT t.a
     , SUM(t.b)
     , AVG(t.c)
  FROM (
         SELECT 'q1' AS source, a, b, c, d FROM t1
          UNION ALL
         SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
       ) t
 GROUP BY t.a
 ORDER BY t.a

答案 2 :(得分:15)

你可以尝试这个注意事项:

SELECT * from table1,table2 

更复杂的一个:

SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse

答案 3 :(得分:5)

如果你的问题是这个 - 选择ename,dname FROM emp,dept而不使用连接..

然后,我会这样做......

SELECT ename, (SELECT dname 
FROM dept
WHERE dept.deptno=emp.deptno)dname
FROM EMP

输出:

ENAME      DNAME
---------- --------------
SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH

ENAME      DNAME
---------- --------------
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

14 rows selected.

答案 4 :(得分:0)

您应该尝试这个

 SELECT t1.*,t2.* FROM t1,t2

答案 5 :(得分:0)

Union将按行而不是按列获取数据,所以如果您像我一样,正在从两个没有关系且没有联接的不同表中获取列数据。
就我而言,我是通过ID获取州名和国家/地区名称。无需编写两个查询,您可以这样做。

select 
   (
   select s.state_name from state s where s.state_id=3
   ) statename,
   (
   select c.description from country c where c.id=5
   ) countryname
   from dual;   

其中dual是具有单列的虚拟表-只需使用表即可查看

答案 6 :(得分:0)

选择“测试”,(从id = 1的雇员中选择姓名)作为名称,(从id = 2的地址中选择姓名)作为地址;

答案 7 :(得分:0)

从表 1 中选择 * 联盟 SELECT * FROM table2

答案 8 :(得分:-2)

在这种情况下,我们假设我们有两个表: 公共列SMPPMsgLog的{​​{1}}和SMSService

serviceid