Примечания SQL соединяются дважды, потому что они связаны с обслуживанием, а не с единичным - PullRequest
0 голосов
/ 09 сентября 2010

Хорошо, у меня есть база данных, которая выглядит следующим образом: Заказы, услуги, заказ единиц, заметки

Orders: id
Services: id, orderid
Units: id, Orderid, unitnumber
Notes: id, relatedid, text, date
  • Заказы имеют от 1 до многих единиц заказа
  • Заказы имеют 1 ко многим услугам
  • Службы имеют от 1 до многих примечаний

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

Я пытаюсь получить следующее:

select u.unitnumber
      ,n.date
      ,o.id
      ,s.id
      ,n.text
 FROM tblorders o
 INNER JOIN tblServices s on o.id = s.orderid
 INNER JOIN tblUnits u on o.id = u.orderid
 INNER JOIN tblNotes n on s.id = n.RelatedId
 WHERE n.Text LIKE '<p>The status for the Unit # % has changed from % to OUTTOVENDOR</p>'

Проблема здесь в том, что это дает мне 2 единицы 4 раза, если в одной и той же службе есть 2 единицы, потому что услуга связана с примечанием, а не с единицей.

В записке есть номер единицы, поэтому мне было интересно, смогу ли я там что-нибудь сделать, чтобы каким-то образом связать заметку с номером единицы?

Спасибо!

Ответы [ 4 ]

1 голос
/ 10 сентября 2010
  1. Если это вообще возможно, , пожалуйста, переименуйте столбцы, чтобы они были одинаковыми в каждой таблице. Не называйте его просто «ID» в таблице заказов, называйте его OrderID (необязательно с заглавной буквы). Поскольку RelatedID относится к таблице услуг, замените ее на ServiceID, чтобы громко кричать! Это сэкономит , поэтому много переименования и псевдонимов, неправильных объединений и общей путаницы. Я обещаю тебе это.

  2. Если Примечания всегда о единицах, их необходимо связать с единицами реляционно через столбец. Вам просто нужно добавить столбец UnitID в таблицу Notes. Все остальное - ужасный взлом производительности, который вернется и будет преследовать вас.

  3. Даже добавление UnitID в таблицу Notes все еще не полностью нормализовано, поскольку примечание может относиться к услуге и модулю, которые не относятся к одному и тому же порядку. Не могли бы вы объяснить подробнее, что такое Подразделения и Услуги и как они и Примечания связаны друг с другом? Могу поспорить, что есть способ это исправить.

0 голосов
/ 09 сентября 2010

Предполагая, что u.unitnumber является целым числом:

select u.unitnumber
      ,n.date
      ,o.id
      ,s.id
      ,n.text
 FROM tblorders o
 INNER JOIN tblServices s on o.id = s.orderid
 INNER JOIN tblUnits u on o.id = u.orderid
 INNER JOIN tblNotes n on s.id = n.RelatedId
        AND n.Text LIKE '<p>The status for the Unit # % has changed from % to OUTTOVENDOR</p>' 
        AND CAST(SUBSTRING(n.Text, 30, CHARINDEX(' ', n.Text, 30) - 30) AS int) = u.unitnumber
0 голосов
/ 09 сентября 2010

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

Между прочим, вы используете текстовое поле, и оно устарело. Возможно, вам следует как можно скорее изменить его на varchar (max) (предполагается, что вы используете SQL Server 2005 или выше).

0 голосов
/ 09 сентября 2010

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

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