プロが教える店舗&オフィスのセキュリティ対策術

http://oshiete1.goo.ne.jp/qa4165327.html
先日上記の質問をさせていただいたのですが、
検索条件が2セットになり、またまた困っている状況です。

前回通り、検索条件間、グループ間での逆転等はOKです。

度々申し訳ないですが、どなた様か知識がある方にご教授願いたく思います。
宜しくお願い致します。

A 回答 (2件)

あのテーブル構造のままやっているんですか?


力技でクエリを書かないといけない場合は、通常テーブル構造に問題があります。
検索条件が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
    • good
    • 0

少し疑問なのが、前回の回答、なぜこういうつくりにしたのかわかりました?


わかって使っていないのなら、また条件が変わったときに同じように聞くとになりますよね。

いっそのこととりあえずデータをソートなしで取得して、
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
みたいな感じで。

そのほうが順位付けのロジックを説明しやすいんじゃないかと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!