lp1*_*lp1 5 sql sql-server-2008
我一直在桌子上敲打着试图弄清楚这个.我有一张表来存储工作信息,以及工作未完成的原因.原因是数字,01,02,03等.您可以将两个原因作为待处理作业.如果选择两个原因,它们将存储在同一列中,并以逗号分隔.这是JOBID表中的一个示例:
Job_Number User_Assigned PendingInfo
1 user1 01,02
Run Code Online (Sandbox Code Playgroud)
还有另一个名为Pending的表,用于存储这些值实际表示的内容.01 =信息不足,02 =时间不够,03 =等待审核.例:
Pending_Num PendingWord
01 Not Enough Info
02 Not Enough Time
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是查询数据库,以便为我提供所有工作号,用户,pendinginfo和待决理由.我可以突破第一个值,但无法弄清楚如何做第二个.到目前为止我的技能有限:
select Job_number,user_assigned,SUBSTRING(pendinginfo,0,3),pendingword
from jobid,pending
where
SUBSTRING(pendinginfo,0,3)=pending.pending_num and
pendinginfo!='00,00' and
pendinginfo!='NULL'
Run Code Online (Sandbox Code Playgroud)
我想在这个例子中看到的是:
Job_Number User_Assigned PendingInfo PendingWord PendingInfo PendingWord
1 User1 01 Not Enough Info 02 Not Enough Time
Run Code Online (Sandbox Code Playgroud)
提前致谢
如果您的SQL想要单独处理它们,那么您真的不应该在一列中存储多个项目.在这些情况下你必须执行的"SQL体操"既是丑陋的黑客又是性能下降.
理想的解决方案是将单个项目拆分为单独的列,对于3NF,如果您确实想要正确地将这些列移动到单独的表中(但如果您确定永远不会有婴儿步骤可能会好的话)短期中期有两个以上的原因).
然后您的查询将更简单,更快捷.
但是,如果这不是一个选项,你可以使用上述SQL体操来做类似的事情:
where find ( ',' |fld| ',', ',02,' ) > 0
Run Code Online (Sandbox Code Playgroud)
假设你的SQL方言有一个字符串搜索功能(find
在这种情况下,但我认为charindex
对于SQLServer).
这将确保所有子列以逗号(逗号加字段加逗号)开头并开始,并查找特定的所需值(两边都有逗号以确保它是完整的子列匹配).
如果你无法控制应用程序在该列中的内容,我会选择DBA解决方案 - DBA解决方案被定义为DBA必须做的工作来解决用户的不足之处:-).
在该表中创建两个新列并创建一个插入/更新触发器,该触发器将使用用户放入原始列的两个原因填充它们.
然后查询这两个新列以获取特定值,而不是尝试拆分旧列.
这意味着拆分的成本仅在行插入/更新时,而不是在_every single select`上,分摊成本有效.
不过,我的答案是重新制作架构.就速度,可读查询和可维护性而言,这将是长期的最佳方式.
我希望你只是维护代码,而不是一个全新的实现.
请考虑使用支持表使用不同的方法,如下所示:
JOBS TABLE
jobID | userID
--------------
1 | user13
2 | user32
3 | user44
--------------
PENDING TABLE
pendingID | pendingText
---------------------------
01 | Not Enough Info
02 | Not Enough Time
---------------------------
JOB_PENDING TABLE
jobID | pendingID
-----------------
1 | 01
1 | 02
2 | 01
3 | 03
3 | 01
-----------------
Run Code Online (Sandbox Code Playgroud)
您可以使用JOIN或子查询轻松查询此表.
如果您需要对软件进行复古兼容性,则可以添加视图以实现此目标.
如果更改架构是一个选项(可能应该是),您不应该在此处实现多对多关系,以便在两个项目之间有一个桥接表吗?这样,您可以将号码及其措辞存储在一个表中,将作业存储在另一个表中,并将“作业失败原因”存储在桥接表中......
归档时间: |
|
查看次数: |
26148 次 |
最近记录: |