好的我有一个看起来如下的数据库: 订单,服务,OrderUnits,注释
Orders: id
Services: id, orderid
Units: id, Orderid, unitnumber
Notes: id, relatedid, text, date
我试图仅关联与单位相关的注释并显示这些记录,问题是注释和单位之间没有数据库关系,只有服务和注释。
我想获得以下内容:
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个单位,这给了我2个单位4次,因为服务与笔记而不是单位有关。
该音符确实包含单元号,所以我想知道我是否可以做任何事情以某种方式将音符与单元号相关联?
谢谢!
答案 0 :(得分:1)
如果可能的话,请在每个表格中将列重命名为相同。不要在订单表中将其称为“ID”,将其称为OrderID(大写可选)。由于RelatedID是指服务表,因此请将其更改为ServiceID,以便大声喊叫!这将节省所以多次重命名和别名以及错误的连接和一般的全面混淆。我保证你这个。
如果Notes始终与单位有关,则需要通过列以关系方式链接到单位。您只需将列UnitID添加到Notes表中即可。其他任何东西都是一个可怕的,性能破坏性的黑客,它会回来困扰你。
即使向Notes表中添加UnitID仍未完全规范化,因为Note可以引用不属于同一订单的Service和Unit。您能否详细解释一下单位和服务是什么以及它们和Notes如何相互关联?我打赌有办法解决它。
答案 1 :(得分:0)
您需要订单吗?如果您有与笔记相关的服务相关的订单,则订单 - &gt; orderUnits关系会导致你的记录集成倍增长,就像你所看到的那样,因为那里没有直接的关系。
答案 2 :(得分:0)
假设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
答案 3 :(得分:0)
如果笔记应始终与单位相关,那么最好的方法是修复设计,而不是破坏它会成为性能杀手。为什么不能为unitid添加一列,使用hack填充一次以获取现有数据,然后在添加注释时更改用户界面以添加单位ID?
顺便提一下,您正在使用文本字段并且不推荐使用这些字段,您可能应该尽快将其更改为varchar(max)(假设您使用的是SQL Server 2005或更高版本)。