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

Nic*_*zen 52 mysql

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

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

Mar*_*rco 44

你可以尝试这样的事情:

SELECT f1,f2,f3 FROM table1
UNION
SELECT f1,f2,f3 FROM table2
Run Code Online (Sandbox Code Playgroud)

  • @AdarshMPallickal:如果您的情况不同,请发布一个显示您的情况和需求的问题...... (5认同)
  • 答案在一栏下 (3认同)
  • 您可能希望使用UNION ALL,以防两个表具有相同的列数据.OP似乎希望显示两个表中的所有记录. (3认同)
  • @AdarshMPallickal:我不明白你的评论,对不起...你是什么意思? (2认同)

spe*_*593 33

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
Run Code Online (Sandbox Code Playgroud)

您可以在一组括号中包装这样的查询,并将其用作内联视图(或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
Run Code Online (Sandbox Code Playgroud)


小智 22

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

SELECT * from table1,table2 
Run Code Online (Sandbox Code Playgroud)

更复杂的一个:

SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse
Run Code Online (Sandbox Code Playgroud)

  • 如果table1为空,那么他将无法从table2获得结果 (12认同)
  • 该符号是否有特定名称? (3认同)
  • 被否决,因为@user846226 的评论是正确的。这个答案通常很有用,但不能正确回答问题。 (2认同)
  • 对我来说这是一个有用的答案,谢谢 (2认同)
  • 我相信这叫做隐式联接 (2认同)
  • @ryvantage 编写上述查询只是 CROSS JOIN 的简写:`SELECT * FROM table1 CROSS JOIN table2` (2认同)

Vin*_*mar 8

如果您的问题是这样-不使用联接就选择ename,dname FROM emp,dept。

然后,我会这样做...

SELECT ename, (SELECT dname 
FROM dept
WHERE dept.deptno=emp.deptno)dname
FROM EMP
Run Code Online (Sandbox Code Playgroud)

输出:

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.
Run Code Online (Sandbox Code Playgroud)


小智 6

你应该试试这个

 SELECT t1.*,t2.* FROM t1,t2
Run Code Online (Sandbox Code Playgroud)

  • 这是隐式连接。正如您 7 年前的类似答案所示,这并不能回答问题。 (3认同)