81

2 つのテーブルからデータを選択し、それらを結合するのではなく、別々の行として表示する最も簡単な方法は何ですか。両方のテーブルに類似または一致するフィールドがあり、両方のテーブルから同じ月に発生したすべての行を平均するなど、集計関数を実行したいと考えています。

たとえば、あるシステムからのトランザクションを示すテーブルと、別のシステムからのトランザクションを示すテーブルの 2 つのテーブルがあります。両方のテーブルからすべてのトランザクションを別々の行として取得する方法はありますか? テーブル 1 に 20 個のレコードがあり、テーブル 2 に 30 個のレコードがある場合、戻り値に 50 行が必要です。

4

9 に答える 9

70

次のようなことを試すことができます:

SELECT ...
FROM (
    SELECT f1,f2,f3 FROM table1
    UNION
    SELECT f1,f2,f3 FROM table2
)
WHERE ...
于 2012-08-23T15:29:40.673 に答える
44

オペレーターはUNION ALLあなたが探しているものかもしれません。

この演算子を使用すると、複数のクエリからの結果セットを連結して、それぞれのすべての行を保持できます。UNION演算子 (ALLキーワードなし) は、結果セットに存在する「重複」行を削除することに注意してください。演算子は、各クエリのUNION ALLすべての行を保持します (重複チェックと削除操作を実行するオーバーヘッドがないため、パフォーマンスが向上する可能性があります)。

列の数と各列のデータ型は、各クエリで一致する必要があります。クエリの 1 つが他のクエリよりも多くの列を持っている場合、列とデータ型を「一致」させるために、他のクエリにダミーの式を含めることがあります。多くの場合、リテラルを返す各クエリの 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
于 2012-08-23T17:53:17.260 に答える
42

この表記法を試すことができます:

SELECT * from table1,table2 

より複雑なもの:

SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse
于 2012-08-23T15:31:42.937 に答える
13

あなたの質問がこれだった場合-結合を使用せずに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.
于 2015-12-15T04:32:52.520 に答える
-1

この場合、次の 2 つのテーブルがあると想定してい ます:SMPPMsgLogSMSService共通の列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;
于 2013-08-07T13:12:46.140 に答える