【发布时间】:2010-10-11 14:14:36
【问题描述】:
我目前有一个主表,其中多个其他表通过多对多连接(使用连接表)与之关联。使用此数据库的应用程序需要具有搜索功能,该功能将打印出匹配特定条件的多行,包括连接表中的所有值。连接表中的值也需要是链接,以便能够搜索与该值匹配的所有其他行。我想弄清楚如何在不对数据库征税的情况下做到这一点。
这是一个表结构的例子
**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
指标将是指标完整描述的链接。但是,此外,Study(即 Study 1、Study 2、Study 3 等)和 MetricTypes(MetricType1、Metric2 等)和 Domains(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
但是,我不确定这种方法对性能的影响,或者它是否真的能得到我想要的东西,因为我认为我可能还需要 Study 的主键。
任何帮助将不胜感激。
谢谢!
【问题讨论】:
-
MetricsMetricTypes 中的最后一个字段是否应该是 MetricTypeID 而不是 DomainID?
-
在您的连接表(即 MetricsDomains)中,您真的需要一个单独的 PK(MetricsDomainsID),还是可以将其组合成两个 FK? (度量 ID、域 ID)。这意味着您只能使用每种组合中的一种,但无论如何感觉都是对的。
-
@Mark 你是对的。我已经在原始问题中修复了它。
-
@Paul 我可以做到。每个组合应该只有一个。不知道这是否会影响原始问题:-/
标签: sql sql-server join many-to-many