2012-01-22 5 views
1

次のSQLを使用して、プロジェクトと関連する請負業者およびドキュメントサイズ情報を3つの異なるテーブルから返します。順序は次のとおりです。最初の請負業者がシステムに入力された後、各契約者ごとにプロジェクトが入力され、文書サイズ(シート)が入力されます。これまでのところは良い、次のSQL戻り細かい適切な請負業者やシートと一緒にすべてのプロジェクト:IF-Elseを使用したSQL Serverのマルチテーブル選択

SELECT 
    dbo.generalcontractors.name, 
    dbo.Projects.*, 
    dbo.sheets.sheetsize, 
    dbo.sheets.sheetid 
FROM 
    dbo.generalcontractors 
INNER JOIN dbo.Projects ON (dbo.generalcontractors.uid = dbo.Projects.generalcontractorid) 
INNER JOIN dbo.sheets ON (dbo.Projects.sheetid = dbo.sheets.sheetid) 
ORDER BY 
    dbo.Projects.projectdate DESC 

さて、何が起こる必要があることは、個々のプロジェクトのための書類がProjectDocumentsテーブルに入力されていることです。私は、文書がProjectsDocumentsテーブルに存在することを確認し、適切な値を返す次のコードを持っています。現在、プロジェクトIDはハードコードされており、動作します。

質問:私は上記のSQLに次のSQLを組み合わせることができますか?私はProjectsDocumentテーブルから一致する行を表示するクエリ結果を探していますが、一致するものが見つからない場合は 'Not Found'と表示されます。

これは、SQL Serverの2005

感謝です!

IF (SELECT COUNT(*) FROM dbo.projectsdocuments, dbo.Projects 
    WHERE projectsdocuments.projectid = Projects.projectid 
    AND Projects.projectid = 5) > 0 
    SELECT * 
    FROM projectsdocuments 
ELSE 
    SELECT 'Not Found' AS HighPrice 
+0

@marc_s。ありがとう。これをあきらめるには早すぎる。私はこれをすべて1つのクエリで返すことができる他の方法? – IrfanClemson

+0

問題のテーブルの "CREATE"ステートメントを投稿できますか?そうすればSSMSを使ってデバッグすることができます。 –

+0

これに従って:http://www.mssqltips.com/sqlservertip/1667/sql-server-join-example/ RIGHT OUTER JOINも動作するはずです。私の現在のsqlにこれが追加されています: '右外部ジョインdbo.projectsdocuments ON(Select * from Projects)'がエラーを取得しています: '条件が期待されるコンテキストで指定された非ブール型の式が' ORDER 'の近くに指定されています。 '(上記の元のSQLのORDERを参照してください)。ありがとう! – IrfanClemson

答えて

1

LEFT OUTER JOINを使用して、ProjectDocumentsテーブルをクエリに単に追加することもできます。

一致する行がProjectDocumentsテーブルに存在しない場合 - その表からすべての列がNULLになります - 何の値は持っていないときに、列のいずれかをキャプチャしISNULL(<colname>, 'Not Found')建設を使用して、あなた「が見つかりません」を表示することだろうProjectDocumentsで発見されて:私はやってお勧めしたい

SELECT 
    gc.name, 
    pr.ProjectDate, pr.Column1, pr.Column2, ....., pr.ColumnN, 
    s.sheetsize, 
    s.sheetid, 
    ISNULL(pd.Name, 'Not Found') AS 'ProjectDocumentName', 
    pd.Column1, ..., pd.ColumnN 
FROM 
    dbo.GeneralContractors gc 
INNER JOIN 
    dbo.Projects pr ON gc.uid = pr.GeneralContractorID 
INNER JOIN 
    dbo.Sheets s ON pr.SheetID = s.SheetID 
LEFT OUTER JOIN 
    dbo.ProjectsDocuments pd ON pr.ProjectID = pd.ProjectID 
ORDER BY 
    pr.ProjectDate DESC 

2つのこと:

  • 有意義テーブルの別名を使用GeneralContractorためgcProjectためprなどのように) - それだけでサイコーはるかに簡単にクエリを読み込みます....

  • を明示的にテーブルから取得するためにしたい列を指定する - 妨げること突然テーブルに5つのBLOBカラムがあると、不要な驚きが発生します。

+0

さて、今すぐあなたの解決策を試してみましょう。ありがとう! – IrfanClemson

+1

動作するソリューション(軽微なエラーを除いて:p.ProjectIDはpr.projectIDでなければなりませんが、大した問題ではありません)。みんなありがとう! – IrfanClemson

+0

このステートメントの唯一の問題は、同じプロジェクトの複数のレコードを返すことです。たとえば、プロジェクトごとに複数のドキュメントがある場合(想定どおり)、同じプロジェクトではあるがドキュメントが異なる行が表示されます。私はここに何人かのグループバイが必要だと思う? – IrfanClemson

1

[LEFT JOIN ProjectDocuments]を選択し、適切なフィールドを選択する必要があります。対応する文書がない場合、ISNULLを使用して、これらのフィールドの1つを「見つからない」に置き換えます。

+0

上記の最初のSQLでLEFT JOINを追加できたら、本当にありがとうございます。ありがとう。 – IrfanClemson

+0

に従って:http://www.mssqltips。com/sqlservertip/1667/sql-server-join-example/LEFT OUTER JOINは動作し、一致しない場合は自動的にNullを返します。しかし、LEFT OUTER JOIN dbo.projectsdocuments ON(dbo.projectsdocument.projectid = dbo.Projects.projectid)を実行すると、エラーが発生します。 'マルチパート識別子「dbo.projectsdocument.projectid」をバインドできませんでした。 – IrfanClemson

+0

テーブル名が間違っていた。新しいLEFT OUTER JOINは次のとおりです。 'LEFT OUTER JOIN dbo.Projects ON(dbo.projectsdocument.projectid = dbo.Projects.projectid)' 私は近づいていると思います! – IrfanClemson