Pregunta Seleccione de varias tablas sin una unión?


¿Cuál es la forma más fácil de seleccionar datos de dos tablas y, en lugar de unirlas, hacer que aparezcan como filas separadas? Ambas tablas tienen campos similares o coincidentes y deseo ejecutar alguna función agregada en ellas, como promedio de todas las filas que ocurrieron en el mismo mes, de ambas tablas.

por ejemplo, tengo dos tablas, una que muestra transacciones de un sistema y otra que muestra transacciones de un sistema diferente. ¿Hay alguna manera de tomar todas las transacciones de ambas tablas como filas separadas? si la tabla 1 tiene veinte registros y la tabla 2 tiene treinta registros, me gustaría que hubiera 50 filas en la declaración.


32
2017-08-23 15:27


origen


Respuestas:


Podrías probar algo como esto:

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

31
2017-08-23 15:29



los UNION ALL operador puede ser lo que estás buscando.

Con este operador, puede concatenar los conjuntos de resultados de múltiples consultas al mismo tiempo, conservando todas las filas de cada uno. Tenga en cuenta que UNION operador (sin el ALL palabra clave) eliminará cualquier fila "duplicada" que exista en el conjunto de resultados. los UNION ALL el operador conserva todas las filas de cada consulta (y probablemente tenga un mejor rendimiento ya que no tiene la sobrecarga de realizar la operación de verificación y eliminación duplicadas).

El número de columnas y el tipo de datos de cada columna deben coincidir en cada una de las consultas. Si una de las consultas tiene más columnas que la otra, a veces incluimos expresiones ficticias en la otra consulta para hacer que las columnas y los tipos de datos "coincidan". A menudo, es útil incluir una expresión (una columna adicional) en la lista SELECCIONAR de cada consulta que devuelve un literal, para revelar cuál de las consultas fue la "fuente" de la fila.

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

Puede envolver una consulta como esta en un conjunto de paréntesis, y usarla como una vista en línea (o "tabla derivada", en la jerga de MySQL), para que pueda realizar operaciones agregadas en todas las filas.

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

26
2017-08-23 17:53



Puede intentar esta notación:

SELECT * from table1,table2 

Más complicado uno:

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

11
2017-08-23 15:31



Si su pregunta era esta: seleccione esame, dname FROM emp, dept sin usar uniones ..

Entonces, yo haría esto ...

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

Salida:

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.

3
2017-12-15 04:32



En este caso, asumimos que tenemos dos tablas: SMPPMsgLogy SMSService con columna común 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 ="23276769075" 
AND date(TimeStamp) <='2013-08-07' 
AND date(TimeStamp) >='2013-08-06' \G;

-2
2017-08-07 13:12