在不知道其中一个字段的情况下选择唯一组合

时间:2013-01-16 17:43:23

标签: sql sql-server-2008

我已经简化了一点来构建问题。涉及的表更多,但这是问题的核心:

所以我在MSSQL 2008中有一个只有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

我确实浏览了这方面的任何例子 - 但它可能我甚至没有考虑正确的搜索条件。感谢。

2 个答案:

答案 0 :(得分: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后确认存在唯一约束以保证不需要这样做

答案 1 :(得分: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
    

  3. 如果您正在寻找完全完全符合您的条件的组,即没有额外行的组,您只需执行以下操作:

    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>)