2

質問を組み立てるために、これを少し簡略化しました。より多くのテーブルが関係していますが、これが問題の核心です。

したがって、MSSQL2008には2列しかないテーブルがあります。

GroupID   |  Culture
1         |  en-gb
2         |  fr-fr
3         |  en-gb
3         |  fr-fr
4         |  en-gb
4         |  fr-fr
4         |  es-es

グループIDが何であるかわかりませんが、次のことができるようにしたいと思います。

1)en-gbのみを選択します-GroupIDが1の一意の行を返し、GroupID 3および4の行は返しません
2)en-gb AND fr-frを選択して、GroupIDを3にします

私はこれの例を探しましたが、正しい検索用語を考えていない可能性があります。ありがとう。

4

2 に答える 2

1

以下を検索していると仮定します'en-gb','fr-fr'

一方通行

SELECT GroupID
FROM   T
GROUP  BY GroupID
HAVING COUNT (CASE
                WHEN Culture IN ( 'en-gb', 'fr-fr' ) THEN Culture
              END) = 2
       AND COUNT(Culture) = 2 

(編集:DISTINCTこれが不要であることを保証するために一意の制約が存在することを確認した後、削除されました)

于 2013-01-16T17:47:30.540 に答える
1

問題は完全には明確ではありません。条件に一致する最初のグループが必要な場合は、次を使用します。

  1. 一致する最初のグループIDを選択するだけです。

    SELECT TOP 1 GroupID 
    FROM myTable 
    WHERE Culture = 'en-gb' 
    ORDER BY GroupID
    
  2. 少しトリッキーですが、同じ概念に従い、両方を含むグループを見つけます。

    SELECT TOP 1 GroupID
    FROM
    (
        SELECT GroupID
        FROM myTable
        WHERE Culture = 'en-gb'
        INTERSECT
        SELECT GroupID
        FROM myTable
        WHERE Culture = 'fr-fr'
    ) x
    ORDER BY GroupID
    

代わりに、条件に完全かつ排他的に一致するグループ、つまり余分な行がないグループを探している場合は、次のようにするだけです。

SELECT GroupID
FROM myTable
WHERE Culture IN (<your criteria list>)
GROUP BY GroupID
HAVING COUNT(DISTINCT Culture) = <count of cultures in your criteria list>
EXCEPT
SELECT GroupID
FROM myTable
WHERE Culture NOT IN (<your criteria list>)
于 2013-01-16T17:50:09.147 に答える