简单的问题。如何重写这样的查询:
SELECT a.name, MAX(b.value), MIN (b.value), COUNT(DISTINCT(b.value))
FROM tableA a
LEFT JOIN tableB b
ON a.type = b.type
WHERE b.value IS NOT NULL
GROUP BY a.name
所以它不会在一个大而不大的桌子上慢慢跑? (比方说100万行)。或者是否有可能在数据库上做一些其他“魔术”以使该查询快速运行?
在这种特殊情况下,将数据进一步规范化是不可能的:)
根据要求提供的其他信息
理想情况下,该解决方案适用于MySQL和MS SQL Server 2008,尽管SQL Server绝对是这些解决方案的优先考虑。
这两个表应如下所示:
Table A:
type INT NOT NULL PRIMARY KEY
name VARCHAR(500
Table B:
idTableC INT NOT NULL
type INT NOT NULL
value VARCHAR (50)
Table C:
idTableC INT NOT NULL PRIMARY KEY
...
所以一般来说,我们想说:对于表C中的每个项目,获取表B中所有项目的类型,在表A中指定。
然而,还必须能够说:对于表A中的每个“类型”,获取表B中与其相关的信息摘要。这是第二种情况,这个问题是关注:)
答案 0 :(得分:1)
你可以在外键上使用非聚集索引,我的意思是[A.Type]
上的2索引和[B.Type]
你也可以在select [A.Name]
,{{{{}}}的列上有两个其他索引1}}
这样您的查询所需的一切都在索引中。
答案 1 :(得分:0)
不确定您正在使用哪个数据库,但您可以确保外键tableA.type上有索引,另外还有tableB.type上包含tableB.value的索引。这样,SQL就不需要返回数据页面来获取值,只需从索引中检索它即可。你应该小心这一点,好像它是一个很大的值,它可能会降低你的索引速度。