2013-07-25 2 views
0

У меня есть настольное оборудование,запрос для отображения внешнего ключа

Это данные, когда я выбираю все в настольном оборудовании.

select * from equipment 

enter image description here

в этой таблице оборудования имеют поле Radio1, Radio2, radio3

значение ID из таблицы радио, здесь Tabel радио

select * from radio 

enter image description here

вопрос в том, как jo на радио и оборудовании, и я нужен Radio1, Radio2, значение radio3 является протоколом из таблицы радио

поэтому значение

radio1  ||  radio2 || radio3 || 
UDP  || Serial Number ||    || 
+0

Вам необходимо нормализовать таблицу. – Kermit

+0

Сколько значений может быть в таблице «radio»? – ErikE

+0

как нормализовать таблицу? @FreshPrinceOfSO. –

ответ

0

ваш дизайн стол беден вы должны нормализовать таблицу. но если вам нужно, как вы сказали. ниже будет метод unefficeint, но проверьте, работает ли он.

select (select protocal from radio where id=equipemnt.radio1) as radio1, 
(select protocal from radio where id=equipemnt.radio2) as radio2, 
(select protocal from radio where id=equipemnt.radio3) as radio3 
from equipment 
+0

извините, я плохо проектирую базу данных таблиц. но спасибо, он работает –

0

Вы должны присоединиться radio один раз для каждого radio... поля в equipment , используя псевдонимы, чтобы различать radio таблиц:

SELECT equipment.*, Radio1.protocol, Radio2.protocol, Radio3.protocol 
FROM equipment INNER JOIN radio as Radio1 ON Radio1.id=equipment.radio1 INNER JOIN radio as Radio2 ON Radio2.id=equipment.radio2 INNER JOIN radio as Radio3 ON Radio3.id=equipment.radio3 
2

Ваша таблица нарушает правила нормализации базы данных. Ввод значений в три отдельные столбцы не лучший дизайн. Вместо этого вы должны иметь таблицу 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 столом.Но «правильный» способ - переместить столбцы радио в новую таблицу, как я показал вам выше.

+0

как добавить LEFT JOIN в ваш запрос? –

+0

Попробуйте прямо сейчас? Я изменил 'CROSS APPLY' на' OUTER APPLY'. – ErikE

+0

что среднее из таблицы 'EquipmentID'' RadioID'? , а затем, когда я использую left, присоединяем sql-ошибку «Только одно выражение может быть указано в списке выбора, когда подзапрос не вводится с EXISTS». –

Смежные вопросы