Ответ 1
Вы можете попробовать что-то вроде этого:
SELECT f1,f2,f3 FROM table1
UNION
SELECT f1,f2,f3 FROM table2
Что является самым простым способом выбора данных из двух таблиц и вместо их объединения, они отображаются как отдельные строки. Обе таблицы имеют похожие или совпадающие поля, и я хочу запустить на них некоторую совокупную функцию, такую как avg все строки, которые произошли в том же месяце, из обеих таблиц.
Например, у меня есть две таблицы, одна из которых показывает транзакции из одной системы и другую с транзакциями из другой системы. Есть ли способ захватить все транзакции из обеих таблиц в виде отдельных строк? если в таблице 1 было двадцать записей, а в таблице 2 было тридцать записей, я бы хотел, чтобы их было 50 строк.
Вы можете попробовать что-то вроде этого:
SELECT f1,f2,f3 FROM table1
UNION
SELECT f1,f2,f3 FROM table2
Оператор 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 lingo), чтобы вы могли выполнять агрегированные операции во всех строках.
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
Вы можете попробовать эту ноту:
SELECT * from table1,table2
Более сложный:
SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse
Если у вас был вопрос: выберите 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.
Вы должны попробовать это
SELECT t1.*,t2.* FROM t1,t2
В этом случае мы предполагаем, что у нас есть две таблицы: 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;