私はテーブルproject p
とテーブルinvoice i
を持っています。どちらもproject_idフィールドを持っています。 project
のすべてのproject_idsを含む結果セットが必要です。ここではi.status = "Active"
であり、それにはinvoice
のすべてのproject_idsが含まれます。invoice_date > 2016-01-01
です。これまでに試した質問があります。SQL OUTER JOINが空のレコードを返す - なぜですか?
SELECT
p.project_id
FROM
(SELECT project_id
FROM project
WHERE status = 'Active') p
FULL OUTER JOIN
(SELECT DISTINCT project_id
FROM invoice
WHERE CONVERT(varchar(10),invoice_date, 20) > '2016-01-01') i
ON i.project_id = p.project_id
アクティブ状態とprojects
で約80プロジェクト=および2016年1月1日以来、請求されているinvoice
で約120のプロジェクトがあります。上記のクエリは約140のレコードを返します。これは正しいと思われるレコード(一部の請求対象外のアクティブなプロジェクトと非アクティブな請求対象のプロジェクト)です。問題は、クエリーのproject_idsの約半分が空(NULL?)であることです。これは、project_idsをinvoice
から引き出していないかのようです。これを修正するのを手伝ってください。ここで
は、配列として結果セットの短いセグメントは
SELECT coalesce(p.project_id, i.project_id) as project_id
へ
...
[10] => Array
(
[project_id] =>
)
[11] => Array
(
[project_id] => C00F2097-CD36-4497-8B26-0BF59F90B1EA
)
[12] => Array
(
[project_id] => 217F3370-50F2-457E-A4F5-0C09F12E654A
)
[13] => Array
(
[project_id] =>
)
[14] => Array
(
[project_id] => B1A06823-73C8-4691-A3D6-0E1A234516B3
etc...
これらは 'アクティブな 'プロジェクトですが、' invoice_date>' 2016-01-01 'というインボイスから対応するプロジェクトがないためです。請求書のための「アクティブ」プロジェクトが存在しない場合があります。 – Lamak
選択項目に両方のテーブルのプロジェクト値を含めます。私も文字列の値で "日付"を比較する理由は困惑している?私はyyyy-mm-dd形式なので動作すると思います。日付のデータ型を使って日付を比較するほうが安全だと思います。 – xQbert