2016-04-18 12 views
0

"Revised"と "Projected"の2つのテーブルからなる単純なSQLクエリ(Oracle)を実行しようとしています。 「改訂された」テーブルからレコードを引き出すことができます。修正されたテーブルが空白の場合は、「投影済み」テーブルから取得する必要があります。私が試みてきたさまざまな結合の組み合わせは、私が探しているデータを返さない。どんな助けもありがとう!SQL 2つのテーブルは、それぞれのデータに応じてプルする必要があります

ありがとうございました。

+0

作成したクエリとテーブルの構造を確認できますか?いずれかのテーブルに多数のフィールドがある場合は、関連するフィールドだけを表示することを検討してください。 –

+0

列にはRevised_ProjectID、Revised_Amt、Revised_DateおよびProjected_Aject、Projected_Amt、Projected_ProjectIDが含まれます。私は以下の両方の提案を試みました。基本的に、改訂表にデータがある場合は、そのデータを使用し、改訂表が空白の場合は、表を使用します。両方のテーブルにデータがある場合、私は改訂版を引き出す必要があります。ありがとうございました。 – bmhitchins91

答えて

0

あなたはこれを試しましたか?

select your columns 
from revised 
union all 
select your columns 
from projected where not exists (select 1 from revised); 

修正されたものからすべてを選択し、改訂されたものがない場合は、すべてから選択します。

あるいは、existsなし:

select your columns 
from revised 
union all 
select your columns 
from projected where (select count(*) from revised) = 0; 

編集:ちょうどプロジェクトごとにフィルタリングし、プロジェクトレベルであなたの条件を得るために:

select your columns 
from revised 
union all 
select your columns 
from projected p where (select count(*) 
         from revised r 
         where r.Revised_ProjectID = p.Projected_ProjectID) = 0; 
+1

フロリン、お返事ありがとうございます。このクエリは、Revisedテーブルからレコードを取り出すだけです。 Revisedテーブルが空白の場合、Projectedから何も取得されていません。これは、クエリを実行するために探しているものです。 – bmhitchins91

+0

これはあなたの望むものではありません。 '改訂からのカウント(*)の選択 'を返すのは何ですか? –

+0

また、非常に重要:私の応答/クエリを理解しましたか? –

0

あなたはケースを使用することができ、左が達成するために参加この。

select p.Project_ID, 
    case when r.Project_ID is null then p.ProjectedPaymentAmount else r.RevisedPaymentAmount end as PaymentAmount, 
    case when r.Project_ID is null then p.ProjectedPaymentDate else r.RevisedPaymentDate end as PaymentDate 
from ProjectPayments_Projected p 
left join ProjectPayments_Revised r on p.Project_ID = r.Project_ID 

プロジェクトに複数のリビジョンがある場合は、これを使用します。

;WITH cte AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (PARTITION BY Project_ID ORDER BY RevisedPaymentDate DESC) AS rn 
    FROM ProjectPayments_Revised 
) 

select p.Project_ID, 
    case when r.Project_ID is null then p.ProjectedPaymentAmount else r.RevisedPaymentAmount end as PaymentAmount, 
    case when r.Project_ID is null then p.ProjectedPaymentDate else r.RevisedPaymentDate end as PaymentDate 
from ProjectPayments_Projected p 
left join cte r on r.rn = 1 and r.Project_ID = p.Project_ID 
+0

列には、Revised_ProjectID、Revised_Amt、Revised_Date、およびProjected_Aject、Projected_ProjectIDが含まれます。私はあなたのSQLを試みるときに "ISとNULLの近くで不正な構文"を取得しています。 – bmhitchins91

+0

構文を修正しました。 'case when' – fqhv

+0

これは必要以上のデータを返します。 R.ID、R.Amt、R.Date&P.ID、P.Amt、P.Date各テーブルに3つの列があります。Revisedテーブルの有無に基づいて正しい3列を返すクエリが必要ですそれに含まれるすべてのデータ。改訂表にデータがある場合は、そのデータをプルします。そうでない場合は、「投影データ」を引き出します。両方にデータがある場合は、Revisedを引く。 – bmhitchins91

0

これを試してください。奇妙に見える。通常動作します。

select id, max(amt) amt, max(date) date 
from (select p.id id, p.amt amt, p.date date 
     from projected p 
     union 
     select r.id, r.amt, r.date 
     from revised) 
group by id; 
+0

Selectステートメントのフィールドはどのテーブルから取得する必要がありますか? – bmhitchins91

+0

インラインビュー。投影 結合から –

+0

SELECT ID、MAX(AMT)AMT、MAX(DATE)DATE P.AMOUNT、P.PROJECT_IDを選択( FROM、PDATE SELECT R.PROJECT_ID、R.AMT、R。 DATE FROM REVISED) GROUP BY ID;私は「GROUP」の近くで誤った構文を取得していますか? – bmhitchins91

0

のでRevised、レコード、ProjectedレコードまたはプロジェクトIDの両方が常にあります。一つの方法は、テーブルを結合し、あなたが得るものを見るの外にされています

select 
    case when revised_projectid is not null then revised_projectid else projected_projectid end as project_id, 
    case when revised_projectid is not null then revised_amt else projected_amt end as project_amt, 
    case when revised_projectid is not null then revised_date else projected_date end as project_date 
from revised r 
full outer join projected p on p.projected_projectid = r.revised_projectid; 

ちょうどそれの楽しみのために、ここで同じ結果を得るUNIONクエリです。私たちは2つのテーブルを結合し、途中で優先フラグを与えます。次に、project_idごとのレコードのランクを上げて、より良いレコードランク1を与えます。次に、他のレコードを破棄して完了します。あなたは、私はあなたに別のオプションを表示するために、私の答えに、この2番目のクエリを追加しました

select project_id, project_amt, project_date 
from 
(
    select 
    project_id, 
    project_amt, 
    project_date, 
    row_number() over (partition by project_id order by priority) as rn 
    from 
    (
    select 
     1 as priority, 
     revised_projectid as project_id, 
     revised_amt as project_amt, 
     revised_date as project_date 
    from revised 
    union all 
    select 
     2 as priority, 
     projected_projectid as project_id, 
     projected_amt as project_amt, 
     projected_date as project_date 
    from projected 
) 
) 
where rn = 1; 

:-)この問題を解決するための多くの方法がある参照してください。今度は1つのアプローチが良いかもしれませんが、次は同じような問題があるときはもう1つは正しい選択でしょう。

+0

最初のクエリは私に正しいロジックを与えますが、同じ値の重複した行を返しています。それを修正する方法はありますか? 2番目のクエリは、私に "シンタックスエラーに近い"というメッセージを与えています。 – bmhitchins91

+0

**最初のクエリ:**わかりました。私は、プロジェクトIDがテーブルに対して一意であると仮定しました。そうでなければ、もちろん重複しているかもしれません。結果からこれらを削除するには、 'SELECT DISTINCT'を使います。とにかく、異なる値を持つ1つのプロジェクトIDに対して複数の結果レコードを取得することは可能です。 ** 2番目のクエリ:**構文エラー(Oracle 11g)が表示されません。おそらく、あなたは非常に古いOracle版を持っていますか? –

関連する問題