我目前有一个主表与其他多个表通过多对多连接(连接表)关联。使用此数据库的应用程序需要具有搜索功能,该功能将打印出符合特定条件的多行,包括连接表中的所有值。来自连接表的值也需要是能够搜索与该值匹配的所有其他行的链接。我想弄清楚如何在不征税的情况下做到这一点。SQL Server多对多连接查询
这里是表结构的一个例子
**Metrics (Main Table)**
MetricID (pk)
Metric
**Domains (ValueList Table)**
DomainID (pk)
Domain
**MetricsDomains (Join Table)**
MetricsDomainsID (pk)
MetricID (fk)
DomainID (fk)
**MetricTypes (ValueList Table)**
MetricTypeID (pk)
MetricType
**MetricsMetricTypes (Join Table)**
MetricMetricTypesID (pk)
MetricID (fk)
MetricTypeID (fk)
**Studies (ValueList Table)**
StudyID (pk)
Study
**MetricsStudies (Join Table)**
MetricsStudiesID (pk)
MetricID (fk)
StudyID (fk)
当有人通过各种标准的公制搜索,他们应该得到以表格的形式输出,看起来是这样的:
Metric1 | Description | Study1, Study2, Study3 | MetricType1, MetricType2 | Domain1, Domain2
Metric2 | Description | Study5, Study2, Study4 | MetricType2, MetricType3 | Domain5, Domain9
的度量标准将成为对度量标准完整描述的链接。然而,此外,研究(即研究1,研究2,研究3等)和MetricTypes(MetricType1,Metric2等)和域(Domain1,Domain 2等)也应该是链接,即当点击时,将对包含该研究,类型或域的所有其他指标执行新的搜索。这使我相信,除了文本之外,为了放置在href中,我还需要研究,类型或域的主键。
无论如何,考虑到一次搜索可能会返回20多个度量标准,我需要弄清楚的是编写优化查询以返回多个多对多连接的结果的好方法。我知道在一个查询中加入所有这些表格通常会产生所有联接的笛卡尔积,但我不确定是否有另一种方式去处理它。我也读到一种方法,我可以用这样的方法在外地返回的许多一对多结果作为逗号分隔的列表:
SELECT m.MetricID, Description,
STUFF((
SELECT ', ' + s.Study
FROM Studies s, Metrics_Studies ms
WHERE s.StudyID = ms.StudyID AND ms.MetricID = m.MetricID
ORDER BY s.Study
FOR XML PATH('')
),1,1,'') as Study,
FROM Metrics m
WHERE Metric_PK = 13
但是,我不知道的对性能的影响这种方法,还是它会真正让我找到我想要的,因为我认为我可能还需要研究的主键。
任何帮助,将不胜感激。
谢谢!
MetricsMetricTypes中的最后一个字段应该是MetricTypeID而不是DomainID吗? – 2010-10-11 14:20:54
在你的joing表(即MetricsDomains)中,你是否真的需要一个单独的PK(MetricsDomainsID),还是可以将它组合成两个FK? (MetricID,DomainID)。这意味着你只能有一种组合,但是无论如何,这种感觉都是正确的。 – 2010-10-11 14:27:48
@Mark你说得对。我已经修复了原来的问题。 – Kirsehn 2010-10-11 18:13:22