【问题标题】:Efficient query for counting multiple relationships of multiple entities计算多个实体的多个关系的高效查询
【发布时间】:2014-01-05 17:49:40
【问题描述】:

使用 MS SQL Server,我想计算与多个实体相关的实体的数量。假设我的架构如下所示:

foo (
  id UNIQUEIDENTIFIER NOT NULL,
)

thing1 (
  id UNIQUEIDENTIFIER NOT NULL
)

thing2 (
  id UNIQUEIDENTIFIER NOT NULL
)

thingN (
  id UNIQUEIDENTIFIER NOT NULL
)

带有连接表

foo_thing1 (
  foo_id UNIQUEIDENTIFIER NOT NULL,
  thing1_id UNIQUEIDENTIFIER NOT NULL
)

等等

可能有 2 个东西,或 10 个,或其他一些数字 - 我想要一些即使有很多也能正常工作的东西。如果只有一个 Foo,可能的解决方案如下所示:

SELECT COUNT(DISTINCT foo_thing1.thing1_id),
       COUNT(DISTINCT foo_thing2.thing2_id),
       COUNT(DISTINCT foo_thing3.thing3_id),
       COUNT(DISTINCT foo_thing4.thing4_id,
FROM foo
LEFT JOIN foo_thing1 ON foo_thing1.thing1_id = thing1.id
LEFT JOIN foo_thing2 ON foo_thing2.thing2_id = thing2.id
LEFT JOIN foo_thing3 ON foo_thing3.thing3_id = thing3.id
LEFT JOIN foo_thing4 ON foo_thing4.thing4_id = thing4.id
GROUP BY foo.id
HAVING foo.id = '12341234-1234-12341234-1234'

但是,我不确定这是否有效。如果 Foo 与很多 thing2s 和很多 thing3s 相关怎么办 - 我是否得到太多行,然后用 DISTINCT 隐藏它?

更复杂的事情是,我实际上想同时计算多个 foo 的关系。理想情况下,我想通过任意 where 子句来完成,但如有必要,我可以提供一个 id 列表,例如 WHERE/HAVING foo.id IN (x, y, z)。但是,从那里,我应该如何确定所有的基数? :(

UNION ALL 是一种选择,因为我组合这些查询的目标是节省数据库往返延迟。但我怀疑多个 SELECT 的解析时间意味着它不可能是 最有效的方式......

【问题讨论】:

  • 不是一回事,不。该张贴者想要计算单个实体的有序列。
  • 当然。我喜欢找到那些不同的对(或三胞胎等)的能力。那么,最好是说您希望自动找到所有对,而不事先知道它们?

标签: sql sql-server


【解决方案1】:

这应该按您期望的方式工作:

SELECT foo.id,
    (SELECT count(*) FROM foo_thing1 WHERE foo_thing1.foo_id = foo.id),
    (SELECT count(*) FROM foo_thing2 WHERE foo_thing2.foo_id = foo.id),
    (SELECT count(*) FROM foo_thing3 WHERE foo_thing3.foo_id = foo.id),
    ...
FROM foo
WHERE foo.id IN (1, 2, 3, 7, ...);

【讨论】:

  • 这看起来很有希望!明天上班时我会尝试并接受答案。在这里使用子查询有什么有趣的注意事项吗?
  • 希望您已将这些 foo_thingN.foo_id 列编入索引,否则查询会变得非常慢。除此之外,您应该没有任何问题。
  • 是的,它们已编入索引。查询最终运行良好。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多