在没有连接的情况下从多个表中选择?

问题描述 投票:0回答:11

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

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

mysql
11个回答
76
投票

你可以尝试这样的事情:

SELECT ...
FROM (
    SELECT f1,f2,f3 FROM table1
    UNION
    SELECT f1,f2,f3 FROM table2
)
WHERE ...

57
投票

你可以尝试这个符号:

SELECT * from table1,table2 

更复杂的一个:

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

此类查询通常称为“隐式连接”,并且显式与隐式 SQL 连接询问两者如何进行比较。在某些情况下,隐式查询执行计划与显式 JOIN 相同。


48
投票

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

16
投票

如果您的问题是这样的 - 选择 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.

11
投票

你应该试试这个

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

3
投票

从表1中选择* 联盟 从表2中选择*


2
投票

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 是一个具有单列的虚拟表 - 任何内容都只需要表即可查看


0
投票

选择“test”,(从员工中选择姓名,其中 id=1)作为姓名,(从地址中选择姓名,其中 id=2)作为地址;


0
投票

你可以使用类似的东西

选择 T1.menuID ,值为 Column_name,T1.menu from T1, T2 CROSS APPLY STRING_SPLIT(Column_name, ',') where T1.menuID = T2.menuid


-1
投票

在本例中,我们假设有两个表:

SMPPMsgLog
SMSService
与公共列
serviceid
:

SELECT sp.SMS,ss.CMD 
FROM vas.SMPPMsgLog AS sp,vas.SMSService AS ss 
WHERE sp.serviceid=5431 
AND ss.ServiceID = 5431 
AND Receiver ="232700000" 
AND date(TimeStamp) <='2013-08-07' 
AND date(TimeStamp) >='2013-08-06' \G;

-1
投票

你可以尝试这个对我来说总是有效的

query="SELECT * from tableX,tableY,table8";
© www.soinside.com 2019 - 2024. All rights reserved.