Sql 如何使用唯一值停止数据复制?
我有这个excel文档,我将该文件中的工作表导入我的数据库,然后使用此代码将它们放在单独的表中:Sql 如何使用唯一值停止数据复制?,sql,sql-server-2012,Sql,Sql Server 2012,我有这个excel文档,我将该文件中的工作表导入我的数据库,然后使用此代码将它们放在单独的表中: insert into LP_Pending_Info(Service_order,Company,Country , HQ_AgingBase_Date ,PENDING_DAYS, Posting_Date,Service_Type,Service_TypeText,SUB_SVC_Type,Status,Status_Text,Reason,Reason_Text,Reason_Aging,S
insert into LP_Pending_Info(Service_order,Company,Country , HQ_AgingBase_Date ,PENDING_DAYS, Posting_Date,Service_Type,Service_TypeText,SUB_SVC_Type,Status,Status_Text,Reason,Reason_Text,Reason_Aging,SVC_Comment,ASC_Code,ASC_Name,ASC_JobNo,Model,CIC_Product,SerialNo,IN_OUT_WTY,IMEI,Defect_DESC,Detail_Type,Detail_TypeText,Repair_RCV_DT,Repair_RCV_TM,Complete_DT,SVC_Level,Consumer,Consumer_Text,TelNumber,City1,Street,Engineer_Code)
select Service_order,Company,Country , [HQ aging base date] ,PENDING_DAYS, Posting_Date,Service_Type,SERVICE_TYPE_TXT,SUB_SVC_Type,Status,Status_Text,Reason,Reason_Text,Reason_Aging,SVC_Comment,[ASC code],[ASC
name],ASC_JOB_NO,Model,CIC_PRD,SERIAL_NO,INOUTWTY,IMEI,Defect_DESC,Detail_Type,DETAIL_TYPE_TEXT,Repair_RCV_DT,Repair_RCV_TM,Complete_DT,SVC_Level,Consumer,consumer_txt,TEL_NUMBER,City1,Street,[Engineer code]
from LP_Pending_Jobs;
insert into LP_Part_Codes(Service_order, PartCode,serPluspart)
select Service_order, Part_code , CONVERT(nvarchar(150), Service_order)+Part_code
from LP_Pending_Jobs
cross apply (
--unpivot
select Part_code1 as Part_code where len(Part_code1) > 0
union all
select Part_code2 where len(Part_code2) > 0
union all
select Part_code3 where len(Part_code3) > 0
union all
select Part_code4 where len(Part_code4) > 0
union all
select Part_code5 where len(Part_code5) > 0
) unp;
insert into LP_PS_Codes(Service_Order, PS)
select Service_order,PS
from LP_Pending_Jobs
cross apply (
select PS1 as PS where len(PS1)>0
union all
select PS2 where len(PS2) > 0
union all
select PS3 where len(PS3) > 0
union all
select PS4 where len(PS4) > 0
union all
select PS5 where len(PS5) > 0
) unp;
insert into LP_Confirmation_Codes(Service_Order, SO_NO)
select Service_order,SO
from LP_Pending_Jobs
cross apply (
select confirmation_No1 as SO where len(confirmation_No1)>0
union all
select SO_NO2 where len(SO_NO2) > 0
union all
select SO_NO3 where len(SO_NO3) > 0
union all
select SO_NO4 where len(SO_NO4) > 0
union all
select SO_NO5 where len(SO_NO5) > 0
) unp;
----------------
insert into LP_QTY(Service_Order, QTY)
select Service_order,QTY
from LP_Pending_Jobs
cross apply (
select QTY1 as QTY where len(QTY1)>0
union all
select QTY2 where len(QTY2) > 0
union all
select QTY3 where len(QTY3) > 0
union all
select QTY4 where len(QTY4) > 0
union all
select QTY5 where len(QTY5) > 0
) unp;
insert into LP_ASC_PO_Codes(Service_Order, ASC_PO_NO)
select Service_order,ASC_PO
from LP_Pending_Jobs
cross apply (
select ASC_PO_No1 as ASC_PO where len(ASC_PO_No1)>0
union all
select ASC_PO_No2 where len(ASC_PO_No2) > 0
union all
select ASC_PO_No3 where len(ASC_PO_No3) > 0
union all
select ASC_PO_No4 where len(ASC_PO_No4) > 0
union all
select ASC_PO_No5 where len(ASC_PO_No5) > 0
) unp;
insert into LP_PO_Date(Service_Order, PO_Date)
select Service_order,PO_Date
from LP_Pending_Jobs
cross apply (
select PO_DATE1 as PO_Date where len(PO_DATE1)>0
union all
select PO_DATE2 where len(PO_DATE2) > 0
union all
select PO_DATE3 where len(PO_DATE3) > 0
union all
select PO_DATE4 where len(PO_DATE4) > 0
union all
select PO_DATE5 where len(PO_DATE5) > 0
) unp;
insert into LP_SO_Date(Service_Order, SO_Date)
select Service_order,SO_Date
from LP_Pending_Jobs
cross apply (
select SO_DATE1 as SO_Date where len(SO_DATE1)>0
union all
select SO_DATE2 where len(SO_DATE2) > 0
union all
select SO_DATE3 where len(SO_DATE3) > 0
union all
select SO_DATE4 where len(SO_DATE4) > 0
union all
select SO_DATE5 where len(SO_DATE5) > 0
) unp;
因为数据在一行中,所以我使用交叉应用程序将每个数据放在单独的列中。
当我加入他们时问题就开始了,因为他们显示了更多的数据。
以下是选择代码:
select distinct LP_Pending_Info.Service_Order,LP_Pending_Info.Pending_Days,
LP_Pending_Info.Service_Type,LP_Pending_Info.ASC_Code,LP_Pending_Info.Model,
LP_Pending_Info.IN_OUT_WTY, LP_Part_Codes.PartCode,LP_PS_Codes.PS,
LP_Confirmation_Codes.SO_NO,LP_Pending_Info.Engineer_Code,serPluspart
from LP_Pending_Info
inner join LP_Part_Codes on LP_Pending_Info.Service_order = LP_Part_Codes.Service_order
inner join LP_PS_Codes on LP_Part_Codes.Service_Order = LP_PS_Codes.Service_Order
inner join LP_Confirmation_Codes on LP_PS_Codes.Service_Order = LP_Confirmation_Codes.Service_Order
order by LP_Pending_Info.Service_order;
我四处打听了一下,说到这里,我需要一个独特的专栏,所以我补充说
“塞普卢斯巴特”
将此列添加到我的表中,希望它能解决我的问题,但当我使用select时,仍然可以看到额外的数据。
以下是前25条记录:
对于顶部的每个服务订单,我有五个部分代码,通过查看图片,部分代码'4182134076'
应该有两行,因为它有两个部分代码,但它显示了8次服务订单,我不知道如何修复它。谢谢你的建议。
此'4182134076'
服务订单的excel输入文件:
Service_order PENDING_DAYS SERVICE_TYPE ASC code MODEL INOUTWTY Part_code1 PS1 ASC_PO_No1 confirmation_No1 QTY1 PO_DATE1 SO_DATE1 Part_code2 PS2 ASC_PO_No2 SO_NO2 QTY2 PO_DATE2 SO_DATE2 Part_code3 PS3 ASC_PO_No3 SO_NO3 QTY3 PO_DATE3 SO_DATE3 Part_code4 PS4 ASC_PO_No4 SO_NO4 QTY4 PO_DATE4 SO_DATE4 Part_code5 PS5 ASC_PO_No5 SO_NO5 QTY5 PO_DATE5 SO_DATE5 Engineer code
4182134076 36 CI 4285818 SM-A310FZDDTHR LP GH96-09938A P 4182134076/1 1000237676 1 09.07.2016 GH81-13601A U 4182134076 1000224921 1 05.06.2016 7086002211
查看输出时,您可能需要八行,因为您有三对二进制可选项(零件代码-GH81-13601A或GH96-09938A;PS-p或U;SO_编号1000224921或1000237676)。因为PartCode、PS和SO NO来自三个不同的表,并且唯一的内部联接在服务订单上,所以您将得到2^3行。在没有看到数据的情况下,很难说到底出了什么问题,但我假设当您说您只需要两行时,这三个元素是链接的,尽管表不是。我想你需要一些外键,但是没有一些样本数据,我不能确定 看到输入数据后,我知道该怎么做了!在LP_Part_代码中,去掉您的列serPluspart(这没有帮助)。现在为每个LP_零件代码、LP_PS_代码和LP_确认_代码添加一个子订单(smallint) 接下来,将列添加到unpivots中,例如:
insert into LP_PS_Codes(Service_Order, PS, SubOrder)
select Service_order,PS,SubOrder
from LP_Pending_Jobs
cross apply (
select PS1 as PS, 1 AS SubOrder where len(PS1)>0
union all
select PS2, 2 AS SubOrder where len(PS2) > 0
union all
select PS3, 3 AS SubOrder where len(PS3) > 0
union all
select PS4, 4 AS SubOrder where len(PS4) > 0
union all
select PS5, 5 AS SubOrder where len(PS5) > 0
) unp;
对LP_零件代码和LP_确认代码执行相同操作
现在,您可以通过添加LP\零件\代码来修改主选择。子订单=LP\零件\代码。子订单=LP\确认\代码。子订单
您现在只有两条订单记录
嗯
Jonathan查看输出,您可能会看到八行,因为您有三对二进制可选项(零件代码-GH81-13601A或GH96-09938A;PS-p或U;SO_编号1000224921或1000237676)。因为PartCode、PS和SO NO来自三个不同的表,并且唯一的内部联接在服务订单上,所以您将得到2^3行。在没有看到数据的情况下,很难说到底出了什么问题,但我假设当您说您只需要两行时,这三个元素是链接的,尽管表不是。我想你需要一些外键,但是没有一些样本数据,我不能确定 看到输入数据后,我知道该怎么做了!在LP_Part_代码中,去掉您的列serPluspart(这没有帮助)。现在为每个LP_零件代码、LP_PS_代码和LP_确认_代码添加一个子订单(smallint) 接下来,将列添加到unpivots中,例如:
insert into LP_PS_Codes(Service_Order, PS, SubOrder)
select Service_order,PS,SubOrder
from LP_Pending_Jobs
cross apply (
select PS1 as PS, 1 AS SubOrder where len(PS1)>0
union all
select PS2, 2 AS SubOrder where len(PS2) > 0
union all
select PS3, 3 AS SubOrder where len(PS3) > 0
union all
select PS4, 4 AS SubOrder where len(PS4) > 0
union all
select PS5, 5 AS SubOrder where len(PS5) > 0
) unp;
对LP_零件代码和LP_确认代码执行相同操作
现在,您可以通过添加LP\零件\代码来修改主选择。子订单=LP\零件\代码。子订单=LP\确认\代码。子订单
您现在只有两条订单记录
嗯
Jonathan我使用该关系连接以服务订单作为主键的表。您想要怎样的样本数据?如果您可以发布服务订单4182134076的输入数据(即excel工作表数据),那就足够了。正如我所写的,三个单独的表都是以相同的服务顺序链接的,我怀疑这在excel工作表中不是唯一的,将给出多个结果。我强烈怀疑您需要在服务订单和服务子订单上保持唯一性。我在问题的末尾添加了该服务订单的excel部分。好的,明白了-我知道问题出在哪里了。给我几分钟的时间,我将编辑我的答案,然后左键连接有问题的表(我想是LP_确认_代码),而不是内部连接,并使用ISNULL(SO_NO.)。我使用关系连接表,并将服务顺序作为主键。您想要怎样的样本数据?如果您可以发布服务订单4182134076的输入数据(即excel工作表数据),那就足够了。正如我所写的,三个单独的表都是以相同的服务顺序链接的,我怀疑这在excel工作表中不是唯一的,将给出多个结果。我强烈怀疑您需要在服务订单和服务子订单上保持唯一性。我在问题的末尾添加了该服务订单的excel部分。好的,明白了-我知道问题出在哪里了。给我几分钟的时间,我将编辑我的答案,然后左键联接有问题的表(我猜是LP_确认码),而不是内部联接,并使用ISNULL(所以不')。