• ベストアンサー

SQL 複数条件を設定

http://oshiete1.goo.ne.jp/qa4165327.html 先日上記の質問をさせていただいたのですが、 検索条件が2セットになり、またまた困っている状況です。 前回通り、検索条件間、グループ間での逆転等はOKです。 度々申し訳ないですが、どなた様か知識がある方にご教授願いたく思います。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

あのテーブル構造のままやっているんですか? 力技でクエリを書かないといけない場合は、通常テーブル構造に問題があります。 検索条件が2件以上になる場合、一致の数え方により多少変わってくると思いますが、 ・検索条件に全く同じ2レコード(aaa,bbb,ccc,ddd,eee,fffが2行)があった場合には単純に一致数は倍になるのですか? ・前回書いたクエリではたとえばa1とa2に両方同じ値が入っていたとしても一致数は1とカウントするように書きましたが、そこはどうなんでしょう。検索条件1のa1にaaaがあって、検索条件2のa2にもaaaがあると一致数が2ならば、検索条件1のa1,a2の両方にaaaがあっても一致数は2でよいのかなと思えます。 いずれにせよ、内容は大きくは変わりません。 最初に検索条件をまとめてあげるやり方を変えるだけだからです。 DECLARE @res TABLE ([ID][int],[CAT][varchar](1),[VAL][varchar](3)) DECLARE @srch TABLE ([CAT][varchar](1),[VAL][varchar](3),[CNT][int]) INSERT INTO @res SELECT ID, 'a' CAT,a1 VAL FROM resulttbl UNION ALL SELECT ID, 'a' CAT,a2 VAL FROM resulttbl UNION ALL SELECT ID, 'b' CAT,b1 VAL FROM resulttbl UNION ALL SELECT ID, 'b' CAT,b2 VAL FROM resulttbl UNION ALL SELECT ID, 'c' CAT,c1 VAL FROM resulttbl UNION ALL SELECT ID, 'c' CAT,c2 VAL FROM resulttbl INSERT INTO @srch SELECT CAT,VAL,COUNT(*) FROM (SELECT 'a' CAT,a1 VAL FROM srchtbl UNION ALL SELECT 'a' CAT,a2 VAL FROM srchtbl UNION ALL SELECT 'b' CAT,b1 VAL FROM srchtbl UNION ALL SELECT 'b' CAT,b2 VAL FROM srchtbl UNION ALL SELECT 'c' CAT,c1 VAL FROM srchtbl UNION ALL SELECT 'c' CAT,c2 VAL FROM srchtbl) tmp GROUP BY CAT, VAL SELECT r.*,ISNULL(c.CNT,0) FROM resulttbl r LEFT OUTER JOIN (SELECT wt.ID, SUM(CNT) CNT, SUM(CASE WHEN wt.CAT='c' THEN CNT ELSE 0 END) CNT_C FROM @res wt INNER JOIN @srch ws ON ws.CAT=wt.CAT AND ws.VAL=wt.VAL GROUP BY wt.ID) c ON c.ID=r.ID ORDER BY CNT DESC,CNT_C DESC

その他の回答 (1)

回答No.2

少し疑問なのが、前回の回答、なぜこういうつくりにしたのかわかりました? わかって使っていないのなら、また条件が変わったときに同じように聞くとになりますよね。 いっそのこととりあえずデータをソートなしで取得して、 java側で一致件数をカウントする関数を通して、java側でソートかけたほうが楽じゃないです? あ、それで、私ならどうするかというと、ユーザー関数を自作します。 文法はうろ覚えなのでイメージだけ Create function Sortlank (tbla1 varchar ,tbla2 varchar, ... pma1_1 varchar, pma2_1 varchar,... pma2_2 varchar,... ) (計算して一致する数を出す) ------- で、Select文は select A.*, dbo.SortLank(a-1,a-2,....,'aaa','bbb'...) as Sortkey order by sortkey,id みたいな感じで。 そのほうが順位付けのロジックを説明しやすいんじゃないかと。