2012-04-29 22 views
1

すべてのカラムが同じでデータは異なる2つのテーブルがあります。彼らは2つの異なる日を表します。テーブルはD1TableとD2Tableです。列は、author1、author2、author3、author4、author5、position1 - position5、title、およびbiography- biography5です。クエリでは、ユーザーがテキストボックスに入力したテキストと一致する列を取得しようとしています(つまり、両方の日に検索を実行できます)。2つのテーブルに複数のカラムを照会するSQL

最初のテーブルではこれまでうまく動作していましたが、最初と2番目のテーブルの両方を検索したいのですが、どうすればよいかわかりません。多くの運が私は間違って何かを間違っている明らかに取得します。また、私は使用していたクエリは本当に長い間あなたが見ることができるように、私はこれを行うには良い方法がなければならないと確信している:

txt = "SELECT * from D1Table WHERE Synopsis LIKE '%" + txtBText + 
     "%' OR Author1 LIKE '%" + txtBText + "%' OR Author2 LIKE '%" + txtBText + 
     "%' OR Author3 LIKE '%" + txtBText + "%' OR Author4 LIKE '%" + txtBText + 
     "%' OR Author5 LIKE '%" + txtBText + "%' OR Biography1 LIKE '%" + txtBText + 
     "%' OR Biography2 LIKE '%" + txtBText + "%' OR Biography3 LIKE '%" + txtBText + 
     "%' OR Biography4 LIKE '%" + txtBText + "%' OR Biography5 LIKE '%" + txtBText + 
     "%' OR Title LIKE '%" + txtBText + "%' OR Position1 LIKE '%" + txtBText + 
     "%'OR Position2 LIKE '%" + txtBText + "%' OR Position3 LIKE '%" + txtBText + 
     "%' OR Position4 LIKE '%" + txtBText + "%' OR Position5 LIKE '%" + txtBText + "%' "; 

は今、私はこれはかなりひどいです知っている、あなたはおそらく言うことができるように私はゴミですSQLのクエリ(私はちょうどそれらを学ぶために始めている)。私は文法を勉強しようとしている間、インターネットのいたるところを見てきましたが、これは私が持っている限りです。だから私はおそらく助けを求める時間だと思っていました。誰かが私にいくつかの指導を与えることができれば、それは非常に高く評価されます。

答えて

2

私の最初の反応は、なぜこのようなアプローチが必要なのでしょうか?あなたのニーズをよりよく説明する必要があるかもしれません。しかしいずれにしても、full text searchをよく調べてみてください。ここ

は、いくつかの有用なリンクである:テキスト検索で

http://en.wikipedia.org/wiki/Full_text_search

、フルテキスト検索は、全文 データベース内の単一のコンピュータに格納された文書またはコレクション を検索するための技術を指します。全文検索は、 メタデータまたはデータベース (タイトル、要約、選択されたセクションまたは参考文献の の参考文献など)に表される元のテキストの一部に基づく検索とは区別されます。

全文検索では、検索エンジンは、検索基準に一致するようにしようとすると、 のすべての単語を検索します(例: 単語)。 1990年代のオンライン書誌データベースでは、全文検索技術が となっていた[確認 が必要]。多くのWebサイトやアプリケーションプログラム(ワード 処理ソフトウェアなど)は、フルテキスト検索機能を提供します。 AltaVistaなどの一部のWeb 検索エンジンでは、全文検索手法 を使用していますが、その他の検索システムでは、 インデックスシステムで調査したWebページの一部のみをインデックスしています。

http://msdn.microsoft.com/en-us/library/ms142571.aspx 上記のリンクからいくつかの引用符:フルテキスト検索とは対照的に全文検索

にLIKE比較 、LIKEのTransact-SQL述語は文字パターンに に動作します。また、LIKE述部を クエリ形式のバイナリデータに使用することはできません。さらに、大量の の非構造化テキストデータに対するLIKEクエリは、同じデータに対する同等のクエリ よりもはるかに低速です。テキストデータの行の何百万もの に対するLIKE照会は、戻すには数分かかることがあります。 クエリは、返される行数に応じて に応じて、同じデータに対してわずか数秒で完了します。

+0

、リンクへの感謝で示されているように...結果を得るために2つのクエリを実行することができます。 – OverHere

1

可能であれば、テーブルの再設計が本当に役に立ちます。 あるプロパティが存在するかどうか、日を別のテーブルに分割する理由によって、列があるDayDataという1つのテーブルがある可能性があります。 日付(intとして格納されているか、SQL 2008 R2のDATEデータ型を使用している可能性あり) フィールド 値

位置が重要な場合(たとえば、author1と何らかの処理がauthor2と異なる場合)、インデックスフィールド(整数型)を使用することもできます。 それぞれの型の正確に5つの値を常に持っているか、または0,1またはNを持つ可能性があり、型が時間の経過と共に変更できるかどうかによって異なります。

とにかくあなたが持っているもので立ち往生している場合、あなたは、フルテキスト検索を試みることができる、またはそれはあまりにも遠くブリッジの場合、

"SELECT * from (select * from D1Table UNION D2Table) D1D2 
WHERE Synopsis LIKE '%" + txtBText + "%' OR Author1 LIKE '%" + txtBText + "%' 
OR Author2 LIKE '%" + txtBText + "%' OR Author3 LIKE '%" + txtBText + "%' 
OR Author4 LIKE '%" + txtBText + "%' OR Author5 LIKE '%" + txtBText + "%' 
OR Biography1 LIKE '%" + txtBText + "%' OR Biography2 LIKE '%" + txtBText + "%' 
OR Biography3 LIKE '%" + txtBText + "%' OR Biography4 LIKE '%" + txtBText + "%' 
OR Biography5 LIKE '%" + txtBText + "%' OR Title LIKE '%" + txtBText + "%' 
OR Position1 LIKE '%" + txtBText + "%'OR Position2 LIKE '%" + txtBText + "%' 
OR Position3 LIKE '%" + txtBText + "%' OR Position4 LIKE '%" + txtBText + "%' 
OR Position5 LIKE '%" + txtBText + "%' "; 

注D1D2と呼ばれる派生テーブルを試してみてください:(選択します* from D1Table UNION D2Table)

しかし、あなたにはSQLインジェクション攻撃(このサイトやGoogleを検索)の脆弱性のようなステートメントを作成するという別の問題があります。誰かが置くことができます

'--delete * from D1Table; 'select * from D1Table where ''1= 

あなたのD1Tableからデータを削除してください。 :)

+0

テーブルを再設計する可能性があります。なぜ私はそれらを分離したのかわかりません、私は明らかにそれを考えなかった。私はSQLの注入物についても見ていきますが、私はそれについてもっと知る必要があると思います。簡単な質問ですが、テキストボックスの値をとるとHttpUtility.HtmlEncode()が使用されます。 私が使用している文字列は次のとおりです:string txtBText = HttpUtility.HtmlEncode(TextBoxSearch.Text);ユーザ入力からのSQL攻撃を防ぐのに十分ではないのだろうか? (私はそうでないと仮定しています) – OverHere

+0

ああ、私はSQLインジェクションについてもう少し読んだことが分かります。代わりにパラメータを使用する必要があります。 – OverHere

+0

@Aaron Bertrand - 整形整頓に感謝します。私はまだStackOverflowに慣れています:)(途中であなたのブログの大きなファン!) –

0
を助けることではなく、クエリはデータベースの設計とユーザ名に関する情報を漏洩し、エラーメッセージまたは意図的なタイミング遅延を生成するために操作されているデータを削除、パスワードなど

・ホープ - 主要なウェブサイトは、同様の技術を使用してハッキングを取得します

私はここで見た他の答えに基本的に同意しますが、私は私の答えとは異なるタックをとるつもりです。

SQLを習得しようとしているなら、より良く使うように訓練することが不可欠です形成する。これは些細なように見えるかもしれませんが、実際には理解しやすく、より理解しやすい書式を使用すれば特にの編集を見つけることができます。

私は実際にC#でc/C++型のブロック引用符を見逃していますが、何十年にもわたるVBプログラミングでは、これがなくてもやや醜い要求に慣れてきました。あなたの例を比較します

はTXT = "あらすじLIKE D1TableからSELECT *「%" + txtBText + "% 'OR Author1 LIKE' %" + txtBText + "% 'OR Author2 LIKE' %" + txtBText + "著者" LIKE '%' + txtBText + "%" OR txtBText + "%" OR txtBText + "% 'バイオグラフィー' LIKE '%' + txtBText + '%' OR Biography4 LIKE '%' + txtBText + "%" OR Biography5 LIKE '% "+ txtBText +"%タイトル%LIKE '%' + txtBText + '%' OR位置2 LIKE '%' + txtBText + "%" OR位置3 LIKE '% "+ txtBText +"% '%' + txtBText + "%" OR Position5 LIKE '% "+ txtBText +"%' ";それに相当する

明らかに
txt = "" 
+ " SELECT * " 
+ " from D1Table " 
+ " WHERE Synopsis LIKE '%" + txtBText + "%' " 
+ "  OR Author1  LIKE '%" + txtBText + "%' " 
+ "  OR Author2  LIKE '%" + txtBText + "%' " 
+ "  OR Author3  LIKE '%" + txtBText + "%' " 
+ "  OR Author4  LIKE '%" + txtBText + "%' " 
+ "  OR Author5  LIKE '%" + txtBText + "%' " 
+ "  OR Biography1 LIKE '%" + txtBText + "%' " 
+ "  OR Biography2 LIKE '%" + txtBText + "%' " 
+ "  OR Biography3 LIKE '%" + txtBText + "%' " 
+ "  OR Biography4 LIKE '%" + txtBText + "%' " 
+ "  OR Biography5 LIKE '%" + txtBText + "%' " 
+ "  OR Title  LIKE '%" + txtBText + "%' " 
+ "  OR Position1 LIKE '%" + txtBText + "%' " 
+ "  OR Position2 LIKE '%" + txtBText + "%' " 
+ "  OR Position3 LIKE '%" + txtBText + "%' " 
+ "  OR Position4 LIKE '%" + txtBText + "%' " 
+ "  OR Position5 LIKE '%" + txtBText + "%' " 
; 

読みやすく、理解しやすいです。直ちに明らかにならないことは、編集が容易であることです。ここから残っているもの

txt = "" 
// <CUT from here 
+ " SELECT * " 
+ " from D1Table " 
+ " WHERE Synopsis LIKE '%" + txtBText + "%' " 
+ "  OR Author1  LIKE '%" + txtBText + "%' " 
+ "  OR Author2  LIKE '%" + txtBText + "%' " 
+ "  OR Author3  LIKE '%" + txtBText + "%' " 
+ "  OR Author4  LIKE '%" + txtBText + "%' " 
+ "  OR Author5  LIKE '%" + txtBText + "%' " 
+ "  OR Biography1 LIKE '%" + txtBText + "%' " 
+ "  OR Biography2 LIKE '%" + txtBText + "%' " 
+ "  OR Biography3 LIKE '%" + txtBText + "%' " 
+ "  OR Biography4 LIKE '%" + txtBText + "%' " 
+ "  OR Biography5 LIKE '%" + txtBText + "%' " 
+ "  OR Title  LIKE '%" + txtBText + "%' " 
+ "  OR Position1 LIKE '%" + txtBText + "%' " 
+ "  OR Position2 LIKE '%" + txtBText + "%' " 
+ "  OR Position3 LIKE '%" + txtBText + "%' " 
+ "  OR Position4 LIKE '%" + txtBText + "%' " 
+ "  OR Position5 LIKE '%" + txtBText + "%' " 
// CUT to here> 
// VV add a UNION 
+ " UNION ALL " 
// <PASTE here 
+ " SELECT + " 
+ " from D2Table " // <-- change the table name here 
+ " WHERE Synopsis LIKE '%" + txtBText + "%' " 
+ "  OR Author1  LIKE '%" + txtBText + "%' " 
+ "  OR Author2  LIKE '%" + txtBText + "%' " 
+ "  OR Author3  LIKE '%" + txtBText + "%' " 
+ "  OR Author4  LIKE '%" + txtBText + "%' " 
+ "  OR Author5  LIKE '%" + txtBText + "%' " 
+ "  OR Biography1 LIKE '%" + txtBText + "%' " 
+ "  OR Biography2 LIKE '%" + txtBText + "%' " 
+ "  OR Biography3 LIKE '%" + txtBText + "%' " 
+ "  OR Biography4 LIKE '%" + txtBText + "%' " 
+ "  OR Biography5 LIKE '%" + txtBText + "%' " 
+ "  OR Title  LIKE '%" + txtBText + "%' " 
+ "  OR Position1 LIKE '%" + txtBText + "%' " 
+ "  OR Position2 LIKE '%" + txtBText + "%' " 
+ "  OR Position3 LIKE '%" + txtBText + "%' " 
+ "  OR Position4 LIKE '%" + txtBText + "%' " 
+ "  OR Position5 LIKE '%" + txtBText + "%' " 
// ^^ change these column names if needed 
; 

はUNIONのために、SELECTのでなければなりません同じ列数と列のデータ型を返さなければならないということです:あなたはUNIONを追加することによって、2つのテーブルをチェックする必要があることを考えてみましょう互換性があります。したがって、D1TableとD2Tableが異なる列を持つ場合、 "*"を削除して各SELECTに対して互換性のある列リストを作成する必要があります。

+0

私は持っていたものよりも読みやすく見ていただきありがとうございます。情報をありがとう。 – OverHere

+0

これは間違いなく書かれているべきです(書式設定はまだわかりません)私が自分の答えで素早くまとめたスニペットを個人的に使用した場合、私の頭がおかしくなります。それ。 –

0

あなたがUNION ALLを使用して、私はそれになります面白そうRBarryYoung

SELECT COLUMN1, COLUMN2 FROM TABLE1 WHERE COLUMN1 LIKE '% Variable %' OR COLUMN2 LIKE '% Variable %' 
UNION ALL 
SELECT COLUMN1, COLUMN2 FROM TABLE2 WHERE COLUMN1 LIKE '% Variable %' OR COLUMN2 LIKE '% Variable %' 
関連する問題