2

データが日付ごとにグループ化された大きなテーブルを作成するために結合しようとしている日付を持つテーブルがいくつかあります。

私は現在、結合する必要があるテーブルから生成されたサブセレクトに LEFT JOIN することでこれを達成しています (それらの多くは同じテーブルであり、WHERE クエリが異なり、SUM と COUNT が含まれているため、サブセレクトを使用する必要があると思います) )。私が抱えている問題は、日付の 1 つが最初のテーブルに存在しない場合、その日付で結合されている後続のテーブルに行があってもテーブルに表示されないことです。DATE(datetime_column)に基づいて参加しています。

だからそれは好きです

SELECT date, col 1 
FROM a 
   LEFT JOIN (SELECT date, col2 FROM a1) a2 ON DATE(a.date)=DATE(a2.date) 
   LEFT JOIN (SELECT date, col3 FROM a3) a4 ON DATE(a3.date)=DATE(a4.date) 

わかる?おそらくない..

4

3 に答える 3

1

これを行うには、基本的に2つの方法があります。

FULLOUTERJOINが使えます

フルアウタージョイン

概念的には、完全外部結合は、左右両方の外部結合を適用する効果を組み合わせたものです。FULL OUTER JOINedテーブルのレコードが一致しない場合、結果セットには、一致する行がないテーブルのすべての列にNULL値が含まれます。一致するレコードの場合、結果セットに1つの行が生成されます(両方のテーブルから入力されたフィールドが含まれます)。

..。

一部のデータベースシステムは、完全な外部結合機能を直接サポートしていませんが、内部結合を使用してエミュレートでき、UNIONALLは左右のテーブルからそれぞれ「単一テーブル行」を選択します。同じ例を次のように表示できます。

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName, department.DepartmentID
FROM employee
INNER JOIN department ON employee.DepartmentID = department.DepartmentID

UNION ALL

SELECT employee.LastName, employee.DepartmentID, CAST(NULL AS VARCHAR(20)), CAST(NULL AS INTEGER)
FROM employee
WHERE NOT EXISTS (SELECT * FROM department WHERE employee.DepartmentID = department.DepartmentID)

UNION ALL

SELECT CAST(NULL AS VARCHAR(20)), CAST(NULL AS INTEGER),
department.DepartmentName, department.DepartmentID
FROM department
WHERE NOT EXISTS (SELECT * FROM employee WHERE employee.DepartmentID = department.DepartmentID)

それ以外の場合は、マスタービューを作成できます。魔女には、すべてのテーブルのすべての個別のキーが含まれ、すべてのテーブルと左結合します。

select *
from (
        SELECT date
        FROM a
        union
        SELECT date
        FROM a1
        union
        SELECT date
        FROM a3
    ) 
    LEFT JOIN a using (date)
    LEFT JOIN a1 using (date)
    LEFT JOIN a3 using (date)

FULL OUTER JOINは多くのRDBMSでサポートされておらず、それをサポートしていて最適化されていない人が多いため、FULL OUTER JOINよりも2番目の方法を好む場合があります。たとえば、Oracleの現在のバージョンでは、完全な外部結合を脅かしています。引用で示された同等のクエリ、魔女はパフォーマンスのために非常に損失があります。

于 2012-07-22T13:08:58.220 に答える
0

OUTER JOIN を使用して、メイン テーブルからすべてのレコードを取得し、サブ/子テーブルから一致するレコードのみを取得してみてください。

SELECT a.Col1, b.Col1 FROM a LEFT OUTER JOIN b ON a.Col2=b.Col2

結合の詳細については、結合(SQL)を参照してください。

于 2012-07-22T07:53:44.057 に答える
0

これには、結合をまったく使用しない別のオプションがあります。ユニオンと集計を使用して結果をまとめることができます。

SELECT date, max(col1) as col1, max(col2) as col2, max(col3) as col3
FROM ((select date, col1, NULL as col2, NULL as col3 from a1) union all
      (SELECT date, NULL, col2, NULL FROM a2) union all 
      (SELECT date, NULL, NULL, col3 FROM a3)
     ) t
group by date 

多くの場合、解決策は Alessandro が提供する 2 番目のものです (最初のバージョンは非常に面倒です)。1 つの警告。彼のソリューションは、データから日付を引き出​​します。場合によっては、カレンダー テーブルから、または日付のリストを生成することによって、マスター リストを生成したいことがあります (その詳細はデータベースに完全に依存します)。

于 2012-07-22T13:41:53.497 に答える