代码之家  ›  专栏  ›  技术社区  ›  timemirror

基于多个属性查找唯一条目的SQL Select语句

  •  0
  • timemirror  · 技术社区  · 14 年前

    把这项工作放在上下文中…我正在尝试过滤一个对象数据库,并构建描述,这些描述可以为语音用户界面进行逐字化。为了尽量减少描述,我想找到最短的方式来描述一个对象,基于格里斯格言的想法。

    在代码中,通过迭代记录和运行所有排列是可能的,但我一直认为应该有一种方法可以在SQL中做到这一点…到目前为止我还没有找到它。(我用的是Postgres。)

    所以我有一张像这样的桌子:

    id     colour   position   height
    (int)  (text)    (text)    (int)
    
    0      "red"    "left"       9
    1      "red"    "middle"     8
    2      "blue"   "middle"     8
    3      "blue"   "middle"     9
    4      "red"    "left"       7
    

    基于属性(不包括ID),我希望找到两个东西。

    a)根据属性的最小数目,是否有任何记录是唯一的? =>例如,根据颜色和高度,记录0是唯一的 =>例如,记录1是中间唯一的红色项 =gt;例如,记录4是唯一的一个高度为7的记录。

    b)特定记录的唯一性如何?

    =>例如,记录0是如何唯一的?因为这是唯一一件红色,高度为9的物品 =gt;例如,记录4是唯一的,因为它是唯一高度为7的项

    当然,根据属性,没有对象是唯一的。

    +++++++++++++++++++++++++

    对(a)的回答

    所以我认为在SQL中实现这一点的唯一方法就是首先测试一个属性,看看是否所有记录都有一个匹配项。如果没有,则添加属性2并再次测试。然后尝试属性1和3。最后尝试属性1、2和3。

    类似这样的事情:

    单柱试验:

    select * from griceanmaxims 
    where height=(Select height from griceanmaxims
    group by height
    having (count(height)=1))  
    or 
    relpos=
    (Select relpos
    from griceanmaxims
    group by relpos
    having (count(relpos)=1))
    or
    colour=
    (Select colour
    from griceanmaxims
    group by colour
    having (count(colour)=1))
    

    双柱试验:

    (Select colour,relpos
    from griceanmaxims
    group by colour,relpos
    having (count(colour)=1))
    
    (Select colour,height
    from griceanmaxims
    group by colour,height
    having (count(colour)=1))
    
    etc
    

    职业教育

    我不确定是否有更好的方法或者如何将双列测试的结果结合起来。

    另外,如果有人对如何确定记录的区别因素有任何建议(如问题B),那就太好了。我的猜测是(b)需要(a)运行所有字段组合,但我不确定是否有更好的方法。

    在此之前,感谢您的帮助…

    1 回复  |  直到 14 年前
        1
  •  1
  •   Dave Mateer    14 年前