构建SQL查询的问题 - 在sql developer中运行

时间:2014-05-21 15:26:42

标签: sql sql-server

我是sql的新手,并拥有一个名为Event的表,其中包含以下列:

  • ID
  • 阶段
  • 类型
  • 位置
  • 国家

所以一个国家可以是意大利,巴西,英国或所有国家。

基本上我需要构建一个我将作为参数传递country的查询,它将返回:

  1. 所有国家/地区,如果All作为参数传递并仅返回 其阶段和类型不同的国家
  2. 如果除All之外的任何其他国家/地区作为参数传递,则应返回 对于选择的国家和所有国家也有他们的阶段和 类型不一样
  3. 因此,例如,如果全部通过,我将仅收到所有国家的数据,其中阶段和类型不同

    如果巴西通过,那么我将收到巴西和所有阶段和类型不同的国家。

    所以如果我在下面的记录中查询了国家巴西:

    ID: 1
    Stage: C
    Type: Football
    Location:City
    Country:All
    
    ID: 2
    Stage: C
    Type: Football
    Location:City
    Country:Brazil
    
    ID 3
    Stage: D
    Type: VolleyBall
    Location:City
    Country:All
    
     ID 4
    Stage: E
    Type: handball
    Location:City
    Country:Brazil
    

    它只返回ID 3和ID 4,因为对于其他类型,Type和stage是相同的。

    如果适用于所有国家/地区:

    ID: 1
    Stage: C
    Type: basketball
    Location:City
    Country:All
    
    ID: 2
    Stage: D
    Type: handball
    Location:City
    Country:Brazil
    
    ID 3
    Stage: C
    Type: VolleyBall
    Location:City
    Country:ALL
    

    它应该返回: 只有ID 1和3。

    我知道会是这样的:

    select *
    from Event
    where country =
    

    提前感谢任何帮助

1 个答案:

答案 0 :(得分:0)

国家部分很容易。

您希望获取国家/地区全部或国家/地区与您的参数匹配的所有行

SELECT * 
  FROM Event
 WHERE Country = @Country or Country = 'All'

你的第二部分要困难得多。

如果我理解你想要返回那个Stage / Type组合只出现一次的所有行。要做到这一点,你需要先得到每个组合的计数,然后选择那个计数= 1的那个

SELECT Stage, Type, count(*) occurrences
  FROM Events 
  GROUP BY Stage, Type
  HAVING count(*) = 1

此查询按阶段和类型对它们进行分组并对它们进行计数,并仅选择那些有1次出现的那些。

您可以将其与联接中的第一个查询结合使用,以获得我想要的内容。

SELECT * 
  FROM Event
  JOIN (
      SELECT Stage, Type, count(*) occurrences
        FROM Events 
        GROUP BY Stage, Type
        HAVING count(*) = 1
 ) uniqueEvents ON uniqueEvents.Stage = Event.Stage AND uniqueEvents.Type = Event.Type
 WHERE Country = @Country or Country = 'All'