2

几个小时以来,我一直在努力解决这个 SQL 难题,所以我心想:“嘿,你为什么不问问堆栈,让网络从解决方案中受益呢?”

所以就在这里。首先,这些是我的 SQL 表:

字段

FieldID INT (PK)
FieldName NVARCHAR(50) (IX)

表单域

FieldID INT (FK)
FormID INT (FK)

价值观

FieldID INT (FK)
RecordID INT (FK)
Value NVARCHAR(1000)

形式

FormID INT (PK)
FormName NVARCHAR(50) (IX)

记录

RecordID INT (PK)
FormID INT (FK)
PoolID INT (FK)

数据池

PoolID INT (PK)
FormID INT (FK)
PoolName NVARCHAR(50) (IX)

考虑以下约束。

  • 每个 Form 有 0 个或多个 DataPool。每个 DataPool 只能分配给一个 Form。
  • 每个表单有 0 个或多个字段。每个字段可能被分配给几个表单。
  • 每条记录都有 0 个或多个 Value。每个值都链接到一个记录。
  • 每个 DataPool 有 0 个或多个 Record。每条记录都链接到一个数据池。
  • 每个值都链接到一个字段。
  • 此外,所有名称列都具有唯一值。

现在,问题来了:

我需要根据以下列从 Values 表中查询每个值:

  • 链接到值的字段名称
  • 数据池的名称链接了链接到值的记录
  • 链接到该数据池的表单的名称

上面的 3 列必须等于存储过程中接收到的 3 个参数。

这是我到目前为止得到的:

CREATE PROCEDURE [GetValues]
@FieldName NVARCHAR(50),
@FormName NVARCHAR(50),
@PoolName NVARCHAR(50)

AS SELECT Value FROM [Values]
JOIN [Fields]
ON [Fields].FieldID = [Values].FieldID
WHERE [Fields].FieldName = @FieldName

如何按 PoolName 列过滤 Values 表的行?DataPools 表与 Values 表没有直接关系,但仍与与 Values 表直接相关的 Records 表相关。关于如何做到这一点的任何想法?

4

2 回答 2

0

我觉得我在你的问题中遗漏了一些东西。如果此解决方案没有解决问题,请告诉我它在哪里遗漏了问题。

SELECT
    Values.Value
FROM
    Values INNER JOIN Fields ON
        Values.FieldId = Fields.FieldId  
    INNER JOIN FormFields ON
        Fields.FieldId = FormFields.FieldId  
    INNER JOIN Forms ON
        FormFields.FormId = Forms.FormId
    INNER JOIN DataPools ON
        Forms.FormId = DataPools.FormId
WHERE
    Fields.FieldName = @FieldName
    AND
    Forms.FormName = @FormName
    AND
    DataPools.PoolName = @PoolName;
于 2010-08-23T18:01:52.020 回答
0

如果我了解您的需求,这应该可以正常工作。

从值 v 中选择 *

join records r
on v.recordid = r.recordid
join datapool dp 
on r.poolid = dp.poolid
join forms f
on r.formid = f.formid
join fields fi
on v.fieldid = fi.fieldid

where
    fi.FieldName = @FieldName
    AND
    f.FormName = @FormName
    AND
    dp.PoolName = @PoolName;
于 2010-08-23T18:16:48.440 回答