繁体   English   中英

组合多个SQL JOIN

[英]Combining multiple SQL 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].[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

我希望此代码可以按字段,表单和池名称过滤“值”。 但是它仅按字段名称过滤。 怎么了?

形式

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

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),“ FormA”(FormID = 96)和“ PoolA1”(PoolID = 29)进行过滤,则会显示“黄色,黄色,黄色,粉红色,粉红色,粉红色”而应为“ Yellow,Yellow,Yellow”。

首先,我建议反转您的WHERE语句的顺序,查询应该执行得更快。 在打开查询计划的情况下在SSMS中运行查询,您会清楚地看到这一点。

其次,我认为它应该起作用,您是否对该查询执行了SELECT * FROM,以确保它不是不良数据的问题。

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

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'

如我所想,问题出在存储过程本身。 其他一切都很好。 JOIN的处理不正确,这就是为什么我得到错误结果的原因。 解决方法如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM