2010-08-26 55 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