【问题标题】:How do I use sets in SQL?如何在 SQL 中使用集合?
【发布时间】:2016-07-08 11:39:53
【问题描述】:

如果您不清楚允许用户插入值的集合是什么,请检查值是否在列表中并找到相交(如果值存在于两个集合中)。此外,一个集合只能保存一个值一次。

如何在 SQL 中使用集合?我正在使用 sqlite,但将转向 postgresql。对我来说最明显的选择是有一个 SetID, SetValue 的 Set 表,这两个值是主键。但是我觉得这不会有效,因为 SetID 会重复很多次。另一种选择是有一个表int SetId, blob SetArray,但我需要手动实现设置逻辑。

在 SQL 中进行集合的最佳方法是什么?对于 sqlite 还是 postgresql?

【问题讨论】:

  • 在我看来,具有两列 SetIDSetValue 的表的第一个选项是迄今为止最好的。多次重复同一个 ID 的开销是最小的,总的来说,通常明显低于拆分 blob 的成本。主键或至少一个唯一索引将确保一个值只能在一个集合中存在一次,然后EXISTSINTERSECT/EXCEPT 运算符可用于识别集合中的重叠和差异,然后对于精确匹配,请参阅this answer
  • @GarethD:我就是这么想的。您的评论应该是一个答案。我不知道 EXCEPT 运算符是个好东西
  • 我不相信该评论有足够的实质内容使其成为答案。我没有任何参考资料或测试来证明一种方法比另一种更好,而且我仅根据我的意见做出的回答可能会阻止其他地方提供更好的、有根据的答案。

标签: sql postgresql sqlite


【解决方案1】:

几个选项:

  1. 查看值的触发器是否存在,如果存在,则返回 NULL(完全完成您正在执行的操作)
  2. 只需使用唯一约束并处理错误

这两种方法都将表从袋子转移到集合,但它们以不同的方式进行,一种是通过赋予它更多类似选择的语义(以降低性能成本),另一种是更传统的 SQL 方式,强制数据验证进入。

如果您想作为一个集合进行选择,请改用select distinct

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多