Sql 如何使用唯一值停止数据复制?

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

我有这个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,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(所以不')。