Объединение нескольких SQL-соединений - PullRequest
1 голос
/ 26 августа 2010
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), он показывает" желтый, желтый, желтый, розовый, розовый, розовый ", тогда как должен быть" желтый, желтый, желтый ".

Ответы [ 3 ]

1 голос
/ 26 августа 2010

Нет ничего плохого в коде, который вы опубликовали. Так что должно быть что-то еще. (например, с пультом телевизора все в порядке, но телевизор не подключен)

1) Убедитесь, что код в процедуре действительно такой, как вы думаете

sp_helptext 'GetValues'

2) Убедитесь, что есть только один GetValues, и вы не используете его от другого пользователя, например. asmo.GetValues ​​

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

3) Если это не удастся, возьмите SQL изнутри proc. Жестко закодируйте значения параметров, запустите его и посмотрите, вернут ли он результаты, которые вы считаете нужными. Если он не публикует этот 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'
1 голос
/ 27 августа 2010

Как я и думал, проблема была в самой хранимой процедуре.Все остальное было в порядке.Соединения были сделаны неправильно, и именно поэтому я получил ошибочные результаты.Вот решение:

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
1 голос
/ 26 августа 2010

Прежде всего, я предлагаю изменить порядок вашего оператора WHERE, запрос должен выполняться быстрее. Запустите запрос в SSMS с включенными планами запросов, и вы это ясно увидите.

Во-вторых, я думаю, что это должно сработать, вы сделали SELECT * FROM с этим запросом, чтобы убедиться, что это не проблема плохих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...