2010-08-26 58 views
1
ALTER PROCEDURE [dbo].[GetValues] 
@FieldName NVARCHAR(50), 
@FormName NVARCHAR(50), 
@PoolName NVARCHAR(50) 

AS SELECT FieldValue FROM [dbo].[Values] 

INNER JOIN [dbo].[Fields] 
     ON [dbo].[Fields].FieldID = [dbo].[Values].FieldID 

INNER JOIN [dbo].[FormFields] 
     ON [dbo].[FormFields].FieldID = [dbo].[Fields].FieldID 

INNER JOIN [dbo].[Forms] 
     ON [dbo].[Forms].FormID = [dbo].[FormFields].FormID 

INNER JOIN [dbo].[Pools] 
     ON [dbo].[Pools].FormID = [dbo].[Forms].FormID 

WHERE [dbo].[Fields].FieldName = @FieldName 
    AND [dbo].[Forms].FormName = @FormName 
    AND [dbo].[Pools].PoolName = @PoolName 

我期望此代码按字段,表单和池名称筛选值。但它只按字段名称进行过滤。怎么了?结合多个SQL JOIN

形式

FormID FormName 
96  FormA 
98  FormB 
97  FormC 

PoolID FormID PoolName 
29  96  PoolA1 
31  98  PoolB1 
30  97  PoolC1 

记录

RecordID PoolID 
42   29 
43   29 
44   29 
45   31 
46   31 
47   31 

V alues

FieldID RecordID FieldValue 
101  42   Yellow 
101  43   Yellow 
101  44   Yellow 
101  45   Pink 
101  46   Pink 
101  47   Pink 
102  42   Smith 
102  43   Jones 
102  44   Fletchers 
103  42   Fred 
103  43   Bob 
103  44   Marty 

例如,如果我用 “最喜欢的颜色”(FieldID = 101), “备考”(FormID = 96)和 “PoolA1”(PoolID = 29)滤波器,它显示“黄,黄,黄色,粉红色,粉红色,粉红色“,而应该是”黄色,黄色,黄色“。

+0

因此,无论你放入@FormName和@PoolName,他们都被忽略?这看起来不正确。 – LittleBobbyTables 2010-08-26 15:55:47

+0

确实,它似乎总是从所有窗体和所有池中选择值。 – asmo 2010-08-26 16:00:09

回答

1

正如我所想,问题出在存储过程本身。其他一切都很好。 JOINs被错误地完成,这就是我得到错误结果的原因。这里的解决方案:

ALTER PROCEDURE [dbo].[GetValues] 
@FieldName NVARCHAR(50), 
@FormName NVARCHAR(50), 
@PoolName NVARCHAR(50) 

AS SELECT FieldValue 
     FROM [dbo].[Values] 

INNER JOIN [dbo].[Fields] 
     ON [dbo].[Fields].FieldID = [dbo].[Values].FieldID 

INNER JOIN [dbo].[Records] 
     ON [dbo].[Records].RecordID = [dbo].[Values].RecordID 

INNER JOIN [dbo].[Pools] 
     ON [dbo].[Pools].PoolID = [dbo].[Records].PoolID 

INNER JOIN [dbo].[Forms] 
     ON [dbo].[Forms].FormID = [dbo].[Pools].FormID 

    WHERE [dbo].[Fields].FieldName = @FieldName 
     AND [dbo].[Forms].FormName = @FormName 
     AND [dbo].[Pools].PoolName = @PoolName 
+0

那么好好标记自己吧。 – 2010-08-27 22:14:18

+0

我还得等15个小时才能接受我自己的答案。顺便说一句,感谢你和康拉德的帮助。我很感激。 – asmo 2010-08-27 23:55:02

1

首先,我建议颠倒你的WHERE语句的顺序,查询应该执行得更快。在启用了查询计划的SSMS中运行查询,您将清楚地看到这一点。

其次,我认为它应该工作,你有没有做一个SELECT * FROM与该查询,以确保它没有坏数据的问题。

+0

据我所知,优化器应考虑WHERE语句并构建最佳查询;顺序无关紧要。请参阅http:// stackoverflow。com/questions/3152182/sql-does-the-order-where-conditions-matter – LittleBobbyTables 2010-08-26 15:51:06

+0

SELECT *如何检测出错误数据的问题? – asmo 2010-08-26 16:02:08

+0

如果问题是具有错误外键数据的行的多个副本。此外,具有相同JOIN/WHERE子句的SELECT *可能会对不良连接形成一些指示。 – 2010-08-26 18:12:21

1

您发布的代码没有任何问题。所以它必须是别的东西。 (例如,电视机遥控器是好的,但电视没有插入)

1)检查在proc的代码是真的你认为它是

sp_helptext 'GetValues' 

2)确保有只有一个GetValues,而你没有使用另一个用户,例如asmo.GetValues

select * from information_schema.routines where specific_name= 'GetValues' 

3)如果失败则从proc中获取SQL。对参数值进行硬编码并运行,看它是否返回您认为应该的结果。如果它不会将该sql发布到SO。

编辑根据您添加的表格,我尝试复制您遇到的问题,但SQL中的表名和数据名称不一样,数字也不相同。所以我试图综合这两个。以下工作。我希望它可以帮助

Create Database Test 
GO 

USE Test 
GO 

CREATE Table Forms 
(FormID int, 
FormName nvarchar(50)) 
GO 

Create Table Pools 
(PoolID int, 
FormID int, 
PoolName nvarchar(50)) 
GO 

Create Table Records 
(RecordID int, 
PoolID int) 
GO 

Create Table [Values] 
(FieldID int, 
RecordID int, 
FieldValue nvarchar(50)) 
GO 

CREATE Table [Fields] 
(
FieldID int, 
FieldName nvarchar(100) 
) 
GO 

CREATE Table [FormFields] 
(
FieldID int, 
FormID int 
) 
GO 

INSERT INTO Forms (FormID, FormName) VALUES (96, 'FormA') 
INSERT INTO Forms (FormID, FormName) VALUES (98, 'FormB') 
INSERT INTO Forms (FormID, FormName) VALUES (97, 'FormC') 
GO 

INSERT INTO Pools (PoolID, FormID, PoolName) Values (29, 96, 'PoolA1') 
INSERT INTO Pools (PoolID, FormID, PoolName) Values (31, 98, 'PoolB1') 
INSERT INTO Pools (PoolID, FormID, PoolName) Values (30, 97, 'PoolC1') 
GO 

INSERT INTO Records (RecordID, PoolID) Values (42, 29) 
INSERT INTO Records (RecordID, PoolID) Values (43, 29) 
INSERT INTO Records (RecordID, PoolID) Values (44, 29) 
INSERT INTO Records (RecordID, PoolID) Values (45, 31) 
INSERT INTO Records (RecordID, PoolID) Values (46, 31) 
INSERT INTO Records (RecordID, PoolID) Values (47, 31) 

GO 

INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (101, 42, 'Yellow') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (101, 43, 'Yellow') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (101, 44, 'Yellow') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (101, 45, 'Pink') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (101, 46, 'Pink') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (101, 47, 'Pink') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (102, 42, 'Smith') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (102, 43, 'Jones') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (102, 44, 'Fletchers') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (103, 44, 'Fred') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (103, 44, 'Bob') 
INSERT INTO [Values] (FieldID, RecordID, FieldValue) Values (103, 44, 'Marty') 

GO 

INSERT INTO [Fields] (FieldID, FieldName) Values (101, 'Color') 
INSERT INTO [Fields] (FieldID, FieldName) Values (102, 'Last Name') 
INSERT INTO [Fields] (FieldID, FieldName) Values (103, 'First Name') 

GO 

INSERT INTO FormFields (FieldID, FormID) Values (101, 96) 
INSERT INTO FormFields (FieldID, FormID) Values (102, 96) 
INSERT INTO FormFields (FieldID, FormID) Values (103, 96) 
INSERT INTO FormFields (FieldID, FormID) Values (101, 97) 
INSERT INTO FormFields (FieldID, FormID) Values (102, 97) 
INSERT INTO FormFields (FieldID, FormID) Values (103, 97) 
INSERT INTO FormFields (FieldID, FormID) Values (101, 98) 
INSERT INTO FormFields (FieldID, FormID) Values (102, 98) 
INSERT INTO FormFields (FieldID, FormID) Values (103, 98) 
GO 





Create PROCEDURE [dbo].[GetValues] 
@FieldName NVARCHAR(50), 
@FormName NVARCHAR(50), 
@PoolName NVARCHAR(50) 

AS 

SELECT 
    v.FieldValue 
FROM 
    dbo.Forms f 
    INNER JOIN dbo.Pools p ON f.FormID = p.FormID 
    INNER JOIN dbo.FormFields ff on f.FormID = ff.FormID 
    INNER JOIN dbo.Fields fd on fd.FieldID = ff.FieldID 
    INNER JOIN dbo.Records r on p.PoolID = r.PoolID 
    INNER JOIN dbo.[Values] v on r.RecordID = v.RecordID 
     and ff.FieldID = v.FieldID 


WHERE 
    fd.FieldName = @FieldName 
    and f.FormName = @FormName 
    AND p.PoolName = @PoolName 
GO 



    dbo.getValues 'Color', 'FormA', 'PoolA1' 
+0

感谢提示!我试过sp_helptext,它向我展示了存储过程。存储过程与我发布的完全相同。然后我尝试了information_schema SELECT,它只返回一个版本的sproc(如预期的那样)。最后我用硬编码参数执行了sproc,并得到了与GUI中相同的结果。所以这个问题一定是别的...... – asmo 2010-08-26 16:56:06