Transact-SQL查询/如何组合多个JOIN语句?

时间:2010-08-23 15:51:14

标签: sql puzzle entity-attribute-value

我已经在几个小时之后开始研究这个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)

考虑以下约束。

  • 每个表单都有0个或更多DataPool。每个DataPool只能分配给一个表单。
  • 每个表单包含0个或更多字段。每个字段可能会分配给多个表单。
  • 每个记录的值为0或更多。每个值都链接到一个记录。
  • 每个DataPool有0个或更多记录。每个记录都链接到一个DataPool。
  • 每个值都链接到一个字段。
  • 此外,所有Name列都具有唯一值。

现在,问题出在此处:

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

  • 与值相关联的字段名称
  • DataPool的名称链接了与值相关联的记录
  • 与该DataPool相关联的表单的名称

上面的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表直接相关。关于如何做到的任何想法?

2 个答案:

答案 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;