我已经在几个小时之后开始研究这个SQL难题,所以我想:“嘿,你为什么不问堆栈并让网络从解决方案中受益? “
所以在这里。首先,这些是我的SQL表:
字段
FieldID INT (PK)
FieldName NVARCHAR(50) (IX)
FormFields
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)
考虑以下约束。
现在,问题出在此处:
我需要根据以下列从Values表中查询evey值:
上面的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表没有直接关系,但它仍然与Records表直接相关,Records表与Values表直接相关。关于如何做到的任何想法?
答案 0 :(得分:1)
我觉得我在你的问题中遗漏了一些东西。如果此解决方案没有解决问题,请告诉我它在哪里找不到问题。
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;
答案 1 :(得分:1)
如果我明白你的需要,这应该可以正常工作。
选择*来自 价值观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;