SQL включается и логика - PullRequest
       6

SQL включается и логика

1 голос
/ 04 декабря 2009

Я работаю с веб-частью SharePoint, которую я проектирую на C #. Мне нужно запросить базу данных SQL Server 2005, чтобы вернуть имена машин, которые связаны с конкретным клиентом, выбранным пользователем.

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

У меня есть таблица "customerInfo", которая содержит идентификатор и имя каждого клиента. Идентификатор является первичным ключом.

Таблица «идентификаторы машины» связывает идентификаторы клиентов с соответствующими идентификаторами машин. Идентификатор машины - это первичный ключ.

У меня есть две таблицы для двух типов машин: «machine1» и «machine2». machine1 содержит имя самой машины, но machine2 содержит только идентификатор типа машины. В обеих этих таблицах идентификатор машины является первичным ключом.

Тогда у меня есть таблица «SpecialtyMachine». Эта таблица содержит название машины и идентификатор машины этого типа. Первичным ключом здесь является идентификатор типа, который идентифицирует тип машины, тогда как идентификатор машины идентифицирует конкретную машину.

Что мне нужно сделать, это получить имя машины из machine1 и specialtyMachine, используя только идентификатор клиента. Я не уверен, возможно ли сделать это с помощью сложного соединения непосредственно в запросе, или мне нужно будет применить логику в веб-части, чтобы собрать эту информацию вместе.

Я также хотел бы знать, как я могу думать об этом с точки зрения общей модели. Я хотел бы иметь возможность распознать это и применять его в будущем, поскольку я уверен, что это довольно распространенная проблема, с которой я еще просто не сталкивался. Спасибо.

Ответы [ 4 ]

1 голос
/ 04 декабря 2009

На основании вашей новой информации о схеме, я думаю, это то, что вы хотите:

select *
from customerinfo c
left join machineids mids on c.customerid = mids.customerid
left join machine1 m1 on mids.machineid = m1.machineid
left join spcialtymachine sm on mids.machineid = sm.machineid -- or m1.machineid = sm.machineid
left join machine2 m2 on sm.typeid = m2.typeid

примечание: если вы используете это в хранимой процедуре с @customerid в качестве параметра, вы можете добавить where c.customerid = @customerid в конец.

1 голос
/ 04 декабря 2009

Вы хотите объединить два запроса.

SELECT c.ID, m1.Name
FROM customerinfo AS c
JOIN machine1 AS m1
ON m1.customerinfoID = c.ID
WHERE c.ID = @customerID

UNION ALL
SELECT c.ID, sm.Name
FROM customerinfo AS c
JOIN machine2 AS m2
ON m2.customerinfoID = c.ID
JOIN specialtyMachine AS sm
ON sm.TypeID = m2.TypeID
WHERE c.ID = @customerID
0 голосов
/ 04 декабря 2009

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

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

Сначала отображение машины будет выглядеть примерно так:

Select m2.mid as mID, m1.name as mName
from specialtyMachine sm
left join machine2 m2 on sm.mid = m2.mid 
left join machine1 m1 on sm.machinename = m1.machinename

Вы можете запустить и проверить это, чтобы увидеть отображение машин на идентификаторы.

Теперь мы присоединяемся к информации о клиенте:

select * 
from customerinfo c
left join 
(
   Select m2.mid as mID, m1.name as mName
   from specialtyMachine sm
   left join machine2 m2 on sm.mid = m2.mid 
   left join machine1 m1 on sm.machinename = m1.machinename
) t on c.mid = t.mid

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

select * 
from customerinfo c
   left join machine2 m2 on c.mid = m2.mid 
   left joint specialtyMachine sm on m2.mid = sm.mid
   left join machine1 m1 on sm.machinename = m1.machinename

Предостережение: я не проверял это, возможно, были опечатки.

0 голосов
/ 04 декабря 2009

Будет ли ваш запрос передан в Имя клиента или Идентификатор клиента и ожидать результата?

Существует ли таблица переходов между CustomerInfo и Machine1 или у Machine1 есть FK для CustomerInfo.Id? Тот же вопрос для Machine2

...