2016-07-11 30 views
2

これらの特定の列がテーブルにあり、別のテーブルと結合し、プライマリキーReportIDが2つのテーブル間のリンクとして機能するSQL文を作成しました。私は会社のレポートを正確に表示するためにNOT INを使用していますが、会社が選択されても出力は得られません。私は再配置する必要があるクエリのどこにありますか?NOT INとSQL join

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
       FROM CompanyReportListTable c 
       right join ReportList rl on c.reportid = rl.ReportID 
       WHERE c.reportid NOT IN(Select rl.ReportID FROM ReportList rl) 
       and rl.ReportVisible = 1 
       and CompanyID = " & DropDownList1.SelectedValue 
+0

MySQLとSQLサーバは同じものではありませんが、実際に使用していますか? – Barmar

+2

SQLインジェクションに自分自身を公開する前に、パラメータ化されたクエリの使い方を読んで理解し始めてください。 –

+4

あなたの 'not in'はあなたが参加したテーブルの中のすべてのレコードを除いて、あなたが参加したテーブルからすべてのレコードを選択します。 –

答えて

0

NOT INを使用して、あなただけの参加で使用する場合で使用する理由、それのための必要性を、it'sない、それの何のメリット、あなたが他のレコードを選択する必要があるだけの場合は唯一の方法はありません同じテーブル(ツリー構造のようなものを使用する場合)は、すべての結果がゼロレコードになるようにしようとしています。

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
    FROM CompanyReportListTable c 
     right join ReportList rl on c.reportid = rl.ReportID 
    WHERE rl.ReportVisible = 1 
     and CompanyID = " & DropDownList1.SelectedValue 

と内側と次のようになり参加:私はちょうどこのような何かが欲しかったと思います

左に

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
    FROM CompanyReportListTable c 
     inner join ReportList rl on c.reportid = rl.ReportID 
    WHERE rl.ReportVisible = 1 
     and CompanyID = " & DropDownList1.SelectedValue 

最後の例は、加入:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
    FROM CompanyReportListTable c 
     left join ReportList rl on c.reportid = rl.ReportID 
    WHERE rl.ReportVisible = 1 
     and CompanyID = " & DropDownList1.SelectedValue 
+1

私はやっていましたが、最初はうまくいっていましたが、予想以上の価値があることに気付きましたので、私の意図はその声明に固執していました。チェックされていないレポート、またはnull値が正確です。今、ゼロレコードについてあなたが言ったことから、今私が経験していることがあります。 –

+0

ヌル結果が「右結合」を使用するよりも「内部結合」を使用しないようにしたい場合(右結合は、この場合は左の他のテーブルに見つからなければnullを返します)、内部の参加する。 –

+1

内部結合を使用することによって、会社に適切なレポートが得られました。しかし今、適切なレポートが表示されたとしますが、会社に適切でない他のレポートもチェックされていないとします。私は正しい結合に戻るか、存在しないか存在しないかのどちらかを使用しますか? –

1

Iドンすべてのレポートを除外したかったと思います。 2つの異なるテーブルの目的を推測することは本当に難しいですが、除外しようとしているレポートのリストをトリムする必要があると思います。 (別の答えでは、「未チェックの報告、またはNULL値」を参照してください。)

SELECT ReportID, COMPANYID, REPORTNAME 
FROM CompanyReportListTable c 
WHERE 
    ReportID NOT IN 
     (
     SELECT rl.ReportID FROM ReportList rl 
     WHERE ... /* which reports are you trying to exclude? */ 
     ) 
    AND ReportVisible = 1 AND CompanyID = ? 
+0

私はチェックボックスを表示させることができました。チェックボックスの数が変わっていて、会社に適切な数のチェックボックスがあることを意味します。問題は、ReportNameが表示されなかったか、またはバインドできないことでした。 –

0

は、だからここに私はこの問題を解決するためにやったことだ:権利を守る、DISTINCTキーワードを削除する二つのテーブルのために参加します。 1つの企業をドロップダウンリストから選択したら、NOT INを使用するのではなく、INを使用してReportListテーブルrlの下のreportIDを選択し、テーブル2のReportListからReportIDを選択し、明快にするためにその名前によって。それを保持することによって、各企業の結果を正確に表示することができますが、今回は、会社ごとに関連付けられていないものの選択を解除します。そのため、会社ごとのレポートの数に関係なく、関連するレポートが表示されます。ここに正しいクエリがあります

valsql1 = "SELECT c.ReportID, c.COMPANYID, rl.REPORTNAME 
FROM CompanyReportListTable c 
right join ReportList rl on c.reportid = rl.ReportID and reportvisible = 1 and CompanyID =" & DropDownList1.SelectedValue & " 
where rl.ReportID IN (Select ReportID from ReportList where ReportVisible = 1) 
order by ReportName"