1

すべて同じ列で異なるデータを持つ 2 つのテーブルがあります。これらは 2 つの異なる日を表しています。テーブルは D1Table と D2Table です。列は、著者 1、著者 2、著者 3、著者 4、著者 5、位置 1 - 位置 5、タイトル、および伝記 - 伝記 5 です。クエリでは、ユーザーがテキスト ボックスに入力したテキストと一致する列を取得しようとしています (したがって、両方の日に検索を実行できます)。

これまでのところ、最初のテーブルでうまく機能していますが、最初と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クエリでゴミです(私はSQLクエリを学び始めたばかりです). 私はしばらくの間、構文を学ぼうとしてインターネット全体を見てきましたが、これは私が得た限りであるため、おそらく私が助けを求める時が来たと思いました. 誰かが私にいくつかのガイダンスを与えることができれば、それは大歓迎です。

4

4 に答える 4

2

私の最初の反応は、なぜそのようなアプローチが必要なのかということです。おそらく、ニーズをよりよく説明する必要があります。full text searchしかし、いずれにせよ、Google で調べたほうがよいでしょう。

便利なリンクを次に示します。

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

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

全文検索では、検索エンジンは、検索基準 (ユーザーが入力した単語など) との一致を試みるときに、保存されているすべてのドキュメントのすべての単語を調べます。全文検索技術は、1990 年代にオンライン書誌データベースで一般的になりました [確認が必要]。多くの Web サイトやアプリケーション プログラム (ワープロ ソフトウェアなど) は、全文検索機能を提供しています。AltaVista などの一部の Web 検索エンジンは、全文検索技術を採用していますが、他の Web 検索エンジンは、その索引システムによって検査された Web ページの一部のみを索引付けします.[1]

http://msdn.microsoft.com/en-us/library/ms142571.aspx 上記のリンクからの引用: LIKE と全文検索の比較

フルテキスト検索とは対照的に、LIKE Transact-SQL 述語は文字パターンに対してのみ機能します。また、LIKE 述語を使用して、フォーマットされたバイナリ データをクエリすることはできません。さらに、大量の非構造化テキスト データに対する LIKE クエリは、同じデータに対する同等のフルテキスト クエリよりもはるかに遅くなります。数百万行のテキスト データに対する LIKE クエリは、返されるまでに数分かかる場合があります。一方、フルテキスト クエリは、返される行数にもよりますが、同じデータに対して数秒以下しかかかりません。

于 2012-04-29T13:50:54.243 に答える
1

可能であれば、テーブルの再設計が非常に役立ちます。プロパティの数と、日を異なるテーブルに分割する理由に応じて、列 Date (おそらく int として格納するか、SQL 2008 R2 の DATE データ型を使用) を持つ DayData という単一のテーブルを作成できます。 フィールド値

位置が重要な場合 (たとえば、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 という派生テーブルに注意してください: (select * from D1Table UNION D2Table)

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

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

D1Table からデータを削除します。主要な Web サイトは同様の手法を使用してハッキングされます。データを削除するのではなく、クエリを操作してエラー メッセージを生成したり、意図的にタイミングを遅らせたりして、データベースの設計やユーザー名、パスワードなどに関する情報を漏らします。

それが役立つことを願っています:)

于 2012-04-29T14:12:28.747 に答える
0

UNION ALLを使用し、2 つのクエリを実行して結果を取得できます... 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 %'
于 2012-05-02T05:20:25.283 に答える
0

ここで見た他の回答には基本的に同意しますが、回答には別の方法をとります。

SQL を学習しようとしている場合は、より良い形式を使用するように自分自身を訓練することが不可欠です。これはささいなことのように思えるかもしれませんが、実際には、より理解しやすい書式を使用する と、読みやすく、理解しやすく、特に編集しやすくなります。

そして、c# での c/c++ 型のブロック引用符が本当に恋しいのですが、何十年にもわたる VB プログラミングのおかげで、引用符がないとやや醜い要件に順応してきました。あなたの例を比較してください:

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 = ""
+ "  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 + "%' "
;

明らかに読みやすく、理解しやすくなっています。すぐにはわかりませんが、編集も簡単です。UNION を追加して 2 つのテーブルをチェックする必要があるとします。

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 は同じ数の列を返す必要があり、列のデータ型は互換性がなければならないということです。したがって、D1Table と D2Table の列が異なる場合は、"*" を削除して、SELECT ごとに互換性のある列リストを作成する必要があります。

于 2012-04-29T14:42:10.303 に答える