2

私のタイトルが達成しようとしているクエリを正しく伝えているかどうかわからないので、編集するか、より正確なより良いものを提案してください. これら2つのテーブルを結合しようとしています:

表 1:

id |field1|field2|
------------------
1  
2
3
4
.
.
. (etc)

表 2:食品

person.id | name
1         | chicken
1         | pork
1         | beef
2         | pork
2         | chicken
3         | chicken
4         | beef
.
. (etc)

ID が豚肉または鶏肉の両方と一致する人物の検索に基づいて、これらのテーブルを結合する必要があります。たとえば、 を検索するporkと 1 と 2 が返され、 and を検索するporkと1 と 2 が返されるはずですが、と同様にchicken一致しないため 3 は返されません。、、およびを検索すると、1 つだけが返されます。chickenporkporkchickenbeef

私はこの質問を見てきましたが、検索する項目の数がわかりません (一度検索するporkchicken、およびpork、、、chickenまたはbeef別の検索になる可能性があります)。

基本的な句を試してみましたWHEREが、これは間違いだと確信していました (クエリが機能しなかったため、これを確認しました)。

SELECT p.id 
FROM people p, foods f 
WHERE p.id = f.person_id AND (f.name = 'pork' AND f.name = 'chicken')

しかし、これは結果を返しません。数年前の SQL チュートリアルからEXISTS、サブクエリと一緒にキーワードを使用する必要があることを覚えているようですが、それに基づいてクエリを作成する方法がわかりません。

編集: SQL Server CE はINTERSECTキーワードをサポートしていないため、残念ながらそのオプションは利用できません。

4

3 に答える 3

3

('chicken', 'pork', 'beef')リストを作成してアプリケーション内の項目を数えることができる場合:

SELECT p.*
FROM   people AS p
  JOIN (
   SELECT person_id
   FROM   foods
   WHERE  name IN ('chicken', 'pork', 'beef')   --- list
   GROUP  BY person_id
   HAVING COUNT(*) = 3                          --- list size
   ) AS pf ON pf.person_id = p.id ;
于 2012-06-26T22:11:03.663 に答える
2

代わりに group by を使用します。

select id
from foods
where name in (<list of foods>)
group by id
having count(*) = <size of list>

恐ろしいことに、実際にリストを文字列に格納して、正しい結果を得ることができます。あなたが持っているとしましょう:

declare @foodlist varchar(8000) = 'pork,chicken'

次に、次のクエリが機能します。

select id
from foods
where charindex(','+name+',', ','+@foodlist+',') > 0
group by id
having count(*) = 1 + len(@foodlist) - len(replace(@foodlist, ',', ''))
于 2012-06-26T21:50:08.150 に答える
0
SELECT p.id 
FROM people p INNER JOIN foods f 
ON p.id = f.person_id 
WHERE f.name in (`list of f.name`)

豚肉、鶏肉、牛肉を検索しても、何も返されないはずです

あなたの表によると、1が返されます。

于 2012-06-26T22:06:48.730 に答える