0

私のテーブルはこんな感じ

id | string | foreign_id
---------------------------
1  | house  | 5
2  | garden | 6
3  | window | 5
...

文字列の配列があり、配列内のすべての要素に一致するすべての外部IDを取得したいと思います。したがって、この[house、window]のような配列があり、5を取得したいと思います。文字列の配列には最大10個の要素を含めることができます。

適切なSQLステートメントはどのように見えますか?

4

5 に答える 5

1

foreign_id「家」と「窓」の両方に一致するものが必要な場合は、次を使用します。

  SELECT t.foreign_id
    FROM YOUR_TABLE t
   WHERE t.string IN ('house', 'window')
GROUP BY t.foreign_id
  HAVING COUNT(DISTINCT t.string) = 2

HAVINGカウントは、IN句で定義された数値と等しくなければなりません。

文字列の配列には、最大10個の要素を含めることができます。

そのためには、動的SQLを使用する必要があります。例を示しますが、使用しているデータベースについては言及されていません...

于 2010-07-07T14:52:44.557 に答える
1

次のようなものを試してください:

select foreign_id 
from your_table
where string in ('house', 'window')
group by foreign_id
having count(distinct string) = 2;

-クエリを生成するものはすべて、要求された個別の文字列の数をカウントできると想定します。

(以下のコメントを編集)

于 2010-07-07T15:04:03.937 に答える
0
select string, foreign_id
from table
group by foreign_id
于 2010-07-07T14:52:11.100 に答える
0

クエリを動的に生成し、配列要素ごとに注記された行を1回追加します。

Select distinct foreign_id
 from myTable
where 1=1
  --add the following line once for each array element
and foreign_id in (select foreign_id from myTable where string = 'value')

したがって、あなたの例を考えると、クエリは次のようになります

Select distinct foreign_id
 from myTable
where 1=1
and foreign_id in (select foreign_id from myTable where string = 'house')
and foreign_id in (select foreign_id from myTable where string = 'window')

これにより、探しているものが返されます。

質問は?

// 1 = 1は、動的部分が毎回同じになるようにするためです。1= 1を除外し、最初のエントリで「および」をスキップします。

于 2010-07-07T14:58:10.813 に答える
0

@Mark Ba​​nnisterは近かったが、stringとforeign_idが重複していると、彼は失敗する。これは機能しますが、SQLで何か便利なことをしてから何年も経っているので、おそらくもっと良い方法があります。

SELECT foreign_id FROM (
   SELECT distinct string, foreign_id FROM your_table
      WHERE string in ('house', 'window')) as T  
GROUP BY T.foreign_id HAVING count(foreign_id) = 2;

Markと同様に、in句とhave句のRHSを動的に設定できると思います。ここでは、ストアドプロシージャが役立つ場合があります。

于 2010-07-07T15:07:16.173 に答える