Ваша таблица нарушает правила нормализации базы данных. Ввод значений в три отдельные столбцы не лучший дизайн. Вместо этого вы должны иметь таблицу EquipmentRadio
со столбцами EquipmentID, RadioID
, имеющими отношение внешнего ключа к таблицам Equipment
и Radio
. Вы можете сделать это так:
CREATE TABLE dbo.EquipmentRadio (
EquipmentID int NOT NULL CONSTRAINT FK_EquipmentRadio_EquipmentID
FOREIGN KEY REFERENCES dbo.Equipment(ID),
RadioID int NOT NULL CONSTRAINT FK_EquipmentRadio_RadioID
FOREIGN KEY REFERENCES dbo.Radio(ID),
CONSTRAINT PK_EquipmentRadio PRIMARY KEY CLUSTERED (EquipmentID, RadioID)
);
INSERT dbo.EquipmentRadio
SELECT
E.ID
FROM
dbo.Equipment E
CROSS APPLY (VALUES
(E.Radio1),
(E.Radio2),
(E.Radio3)
) R (RadioID)
WHERE
R.RadioID IS NOT NULL -- or `> 0` if appropriate
;
ALTER TABLE dbo.EquipmentRadio DROP COLUMN Radio1;
ALTER TABLE dbo.EquipmentRadio DROP COLUMN Radio2;
ALTER TABLE dbo.EquipmentRadio DROP COLUMN Radio3;
Конечно, не делают этого, особенно капельном колонны часть, если вы не уверены, что это все правильно. Чтобы использовать этот дизайн, вам необходимо соответствующим образом изменить свои клиентские формы и код переднего плана.
Ваша таблица будет выглядеть следующим образом:
EquipmentID RadioID
----------- -------
1 1
1 2
-- (notice there's no third row, but you could have 3 or even more)
В то же время, если вы являются собирается использовать только три колонки, которые у вас есть, есть лучше, чем при использовании трех отдельных подзапросов.
SELECT
E.ID,
R.* -- should name the columns explicitly, though
FROM
dbo.Equipment E
OUTER APPLY (
SELECT
P.*
FROM
(
SELECT U.Radio, R.Protocol
FROM
(VALUES
('Radio1', E.Radio1),
('Radio2', E.Radio2),
('Radio3', E.Radio3)
) U (Radio, RadioID)
INNER JOIN dbo.Radio R
ON U.RadioID = R.ID
WHERE
U.RadioID IS NOT NULL -- or `> 0` if appropriate
) X
PIVOT (Max(X.Protocol) FOR X.Radio IN (Radio1, Radio2, Radio3)) P
) R
;
Что это делает временно UNPIVOT 3 значений в 3 ряда (например, нормированный база данных будет иметь), а затем присоединиться к ним в один присоединиться к Radio
, а затем, наконец, повернуть их обратно в 3 колонки. Это много глупости, чтобы пройти, чтобы разместить денормализованный дизайн.
See a Live Demo at SQL Fiddle
Примечание: в моем демо я использовал NULL
вместо 0
для Radio3
, потому что это единственный способ иметь надлежащий внешний ключ отношения с Radio
столом.Но «правильный» способ - переместить столбцы радио в новую таблицу, как я показал вам выше.
Вам необходимо нормализовать таблицу. – Kermit
Сколько значений может быть в таблице «radio»? – ErikE
как нормализовать таблицу? @FreshPrinceOfSO. –