SQL注释加入两次,因为它们与服务而不是单元相关
好的,我有一个如下所示的数据库: 订单、服务、订单单位、备注SQL注释加入两次,因为它们与服务而不是单元相关,sql,sql-server,tsql,Sql,Sql Server,Tsql,好的,我有一个如下所示的数据库: 订单、服务、订单单位、备注 Orders: id Services: id, orderid Units: id, Orderid, unitnumber Notes: id, relatedid, text, date 订单有1到多个订单单位 订单有1到多个服务 服务有1到多个注释 我试图只关联与该单元相关的注释并显示这些记录,问题是注释和单元之间没有数据库关系,只有服务和注释 我正试图获得以下信息: select u.unitnumber ,n
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个单位,那么这会给我2个单位4次,因为服务与票据相关,而不是与单位相关
便笺中确实包含单元号,所以我想知道我是否可以在那里做些什么,以某种方式将便笺与单元号联系起来
谢谢 您需要订购单位吗?如果您有与notes相关的服务相关的订单,订单->订单单位关系将导致您的记录集呈指数增长,正如您所看到的,因为那里没有直接关系。假设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
如果注释总是与单元相关,那么最好是修复设计,而不是用性能杀手的东西进行修改。为什么不能为unitid添加一列,使用hack来填充它一次以获取现有数据,然后在添加注释时将用户界面更改为添加单元id 顺便说一句,如果您使用的是一个文本字段,并且这些字段已被弃用,那么您可能应该尽快将其更改为varcharmax。假设您使用的是SQL Server 2005或更高版本 如果可能,请将每个表中的列重命名为相同的列。不要在order表中仅称其为ID,可以将其称为OrderID大写。因为RelatedID引用服务表,所以将其改为ServiceID,以便大声呼喊!这将节省大量重命名、别名、不正确的连接和全面的混乱。我向你保证 如果注释始终是关于单位的,则需要通过列将注释与单位进行关联。您只需将列UnitID添加到Notes表中。其他任何东西都是一种可怕的、破坏性能的黑客行为,它会回来困扰你 即使将UnitID添加到Notes表中,仍然没有完全规范化,因为注释可能引用的服务和单元顺序不同。请您详细解释一下什么是单位和服务,以及它们和注释之间的关系?我打赌有办法解决它
顺便说一句,注释始终从%开始,直到%,显然单位发生了变化。如果注释中引用了单位,则可以使派生表使用计算列,从注释文本中提取单位,并使用该列关联注释。这是一个黑客-任何符号上的不一致都必须解决。这正是我想做的。是的,这实际上是我需要单位的全部问题……单位在注释中,但实际上与数据库无关。我知道很棒的设计;你能把orderunits聚合起来,这样每个订单只返回一行吗?1.这些列实际上有那些命名约定,我刚才快速写了这个问题,以便于举例。2.我意识到,我不是在设计应用程序,但我在推动变革!3.我现在正在使用黑客破解的解决方案,同时推动变革!是的,我建议他们停止使用ID,每次我看到有人使用它,我都会退缩。