【发布时间】: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