2016-06-06 6 views
-1

В MS SQL Server у меня есть таблица, содержащая множество параметрических столбцов. У меня есть отдельная таблица параметров, содержащая все значения параметров. Если я хочу выбрать значения параметров для каждого столбца, я должен сделать JOIN для каждого столбца.SQL Server Несколько JOIN

В приведенном ниже примере мне нужно выполнить 3 JOINs , которые я не предпочитаю, так как мне может понадобиться много столбцов больше. Как я могу присоединиться к таблице параметров эффективно?

enter image description here Студенты;

StudentiD RegistrationStatus MaritalStatus Gender RegistrationDesc MaritalSTatusDesc GenderDesc 
1   RG     SNG    M  TO BE JOINED  TO BE JOINED  TO BE JOINED 
2   NR     MRD    F  TO BE JOINED  TO BE JOINED  TO BE JOINED 

Параметры;

GROUP    KEY VALUE 
RegistrationStatus RG Registered 
RegistrationStatus NR Not Registered 
MaritalStatus  SNG Single 
MaritalStatus  MRD Married 
Gender    M  Male 
Gender    F  Female 
+3

Вы были здесь достаточно долго, чтобы знать, что изображения неодобрением. Пожалуйста, разместите свои образцы данных в текстовой форме или еще лучше, создайте скрипку. –

+0

Текстовая форма не может форматировать данные для четкого понимания. Как я могу разместить таблицу excel без нарушения визуального формата? –

+0

http://meta.stackexchange.com/questions/96125/how-to-format-sql-tables-in-a-stack-overflow-post –

ответ

1

Вы всегда можете сделать это функция, которую вы звоните в вашем запросе на выборку, он не собирается быть очень эффективным, как только вы получите в больших наборах данных (читать на скалярных функций), но это сделает ваш код более легче читать.

Функция;

CREATE FUNCTION [dbo].[FN_Parameters](@Group varchar(255), @Key nvarchar(255)) 
RETURNS nvarchar(255) 
AS 
BEGIN 
    declare @value nvarchar(255) 
    select @value = [value] from Parameters where [Group] = @Group AND [Key] = @Key 
    RETURN (@value) 
END 

Ваш запрос будет называться так:

SELECT 
StudentiD 
,RegistrationStatus 
,MaritalStatus 
,Gender 
,dbo.FN_Parameters('RegistrationStatus',RegistrationStatus) RegistrationDesc 
,dbo.FN_Parameters('MaritalStatus',MaritalStatus) MaritalStatusDesc 
,dbo.FN_Parameters('Gender',Gender) GenderDesc 
FROM Students 

Я, однако, не использовать имена «Group», «Key» и т.д., поскольку эти зарезервированные слова в сервере SQL, это действительно плохая практика, а затем требует оборачивать в квадратных скобках, возьмите прочитать здесь;

https://msdn.microsoft.com/en-us/library/ms189822.aspx

Edit: Я изменил функцию, чтобы позволить вам пройти в обеих группах и ключ только в случае, если у вас есть дубликаты ключей в там.

0

С использованием динамического SQL:

DECLARE @sql nvarchar(max) = 
'SELECT *' 

SELECT @sql = @sql + CAST((
SELECT DISTINCT ',(SELECT [VALUE] FROM Parameters WHERE [KEY] = '+ [GROUP] +' AND [GROUP] = ''' +[GROUP]+''') AS ' +[GROUP]+'Desc' 
FROM Parameters 
FOR XML PATH('') 
) as nvarchar(max)) 


SET @sql = @sql +' 
FROM Students s' 

PRINT @sql 
EXECUTE sp_executesql @sql 

Выход:

StudentId RegistrationStatus MaritalStatus Gender GenderDesc MaritalStatusDesc RegistrationStatusDesc 
1   RG     SNG    M  Male  Single    Registered 
2   NR     MRD    F  Femail  Married    Not Registered