SQL Server多个多对多连接查询

时间:2010-10-11 14:14:37

标签: sql sql-server join many-to-many

我目前有一个主表,其中有多个其他表通过多对多连接(使用连接表)与之关联。使用此数据库的应用程序需要具有搜索功能,该功能将打印出符合特定条件的多行,包括连接表中的所有值。连接表中的值也需要是能够搜索与该值匹配的所有其他行的链接。我试图弄清楚如何在不对数据库征税的情况下做到这一点。

以下是表结构的示例

**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

但是,我不确定这种方法对性能的影响,或者它是否真的能让我得到我想要的东西,因为我认为我可能也需要研究的主键。

任何帮助都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

我建议先使用多连接进行操作 - 只有这样你才能知道perofrmance是否足够好。一如既往,你必须要注意过早优化。一旦您的查询针对规范化模型正确运行,您就可以检查查询计划等。这可能会突出显示您需要展平一些联接,如果是这种情况,您可能需要将数据存储在两个不同的格式,一个用于报告/一个用于搜索等。但第一件事是看看性能是否真的可以接受开箱即用。希望这会有所帮助。