【问题标题】:Fill a table without duplicates填写没有重复的表格
【发布时间】:2018-04-22 23:32:37
【问题描述】:

我正在尝试使用该表中的值填充一个表

CREATE TABLE PLATOS(Idplatos integer PRIMARY KEY, Tipo varchar(20), PlatoP varchar(20));

INSERT INTO Platos VALUES('1','entrada','ceviche');
INSERT INTO Platos VALUES('2','entrada','arrozleche');
INSERT INTO Platos VALUES('3','sopa','caldo');
INSERT INTO Platos VALUES('4','sopa','mote');
INSERT INTO Platos VALUES('5','plato','lomo');
INSERT INTO Platos VALUES('6','plato','rusa');

到这个:

Create table abril2017(nrodia integer,entrada varchar(20), sopa varchar(20), plato varchar(20),unique(entrada,sopa,plato));

我试过这段代码

    declare @nd int
    set @nd=1
    while @nd<=31
    begin

    Insert into  abril2017 values (@nd,
   (Select TOP 1 PlatoP from Platos where tipo = 'entrada' oRDER BY NEWID()),
    (Select TOP 1 PlatoP from Platos where tipo = 'sopa'  Order by NewId()),
    (Select TOP 1 PlatoP from Platos where tipo = 'plato' oRDER by NewId()))
    SET @nd=@nd+1
    end

到目前为止结果还可以,但我不想出现的错误是:

1) nrodia,只有在成功插入时才必须 +1,现在 它总是+1,这破坏了他的目的。 nrodia 的意思是“天数”。

2) 违反 UNIQUE KEY 约束 'UQ__abril201__24030ECAAB418A64'。无法插入重复键 对象“dbo.abril2017”。重复键值为 (arrozleche, mote, 洛莫)。声明已终止。

出现此错误,但无论如何我的所有值都被插入而没有重复,我只是不想在执行插入的最后一个代码时显示这个或类似的东西,我不知道这是一个错误还是只是相似的东西?。 最后代码可以正常工作并且必须解决这些问题,第一个表实际上将有 15 个值而不仅仅是 6 个,所以如果有人可以为我提供更多值的情况的解决方案会更好,谢谢。

1   arrozleche  caldo   lomo
3   arrozleche  mote    lomo
4   ceviche     mote    lomo
5   ceviche     mote    rusa
7   arrozleche  mote    rusa
8   ceviche     caldo   rusa
11  ceviche     caldo   lomo
16  arrozleche  caldo   rusa

如何查看第一个表中不重复的那些值的所有可能组合(但仍然显示问题编号 2)),左侧的数字必须是 1,2,3.. . 直到最后一行,在本例中为 8。这只是一个示例,如果您使用代码插入,您将有一个不同的表,因为插入的值是随机的。

【问题讨论】:

    标签: sql insert duplicates


    【解决方案1】:

    你可以这样做,像这样:

    declare @nd int
    set @nd=1
    DECLARE @xEntrada VARCHAR(20), @xSopa varchar(20), @xPlato varchar(20)
    DECLARE @xResultCount INT = 8
    while @nd<=31
    begin
        Select TOP 1 @xEntrada = PlatoP from Platos where tipo = 'entrada' oRDER BY NEWID()
        Select TOP 1 @xSopa = PlatoP from Platos where tipo = 'sopa'  Order by NewId()
        Select TOP 1 @xPlato = PlatoP from Platos where tipo = 'plato' oRDER by NewId()
    
        IF (NOT EXISTS(SELECT 1 FROM abril2017 WHERE Entrada = @xEntrada AND Sopa = @xSopa AND Plato = @xPlato))
        BEGIN
            Insert into  abril2017 values (@nd,@xEntrada,@xSopa,@xPlato)
            SET @nd=@nd+1
            SET @xResultCount = @xResultCount - 1
            IF(@xResultCount = 0)
                BREAK
        END
    END;
    

    【讨论】:

    • 哇太棒了,非常感谢它起作用了,尽管我不知道为什么我必须停止执行查询,因为它就像“正在执行查询...”几分钟(而我不得不停止它,但无论如何实际上插入了值),这很正常吗?或者也许它只是我的笔记本电脑?再次感谢您(也许过一段时间我会发布关于整个项目的另一个问题)
    • 它与您的笔记本电脑无关,您必须计算所有可能的真实结果的计数,并在达到所需结果后使用break命令停止执行查询
    • 嗯,我需要放一些代码才能没有“无限”执行查询?还是设限? (我不知道该怎么做:()在你的帮助下,我进入了这个问题的下一步,现在是关于创建一个程序。如果你有更多的时间,希望你能帮助我:D。
    • 最佳实践是对所有可能的结果进行统计计算,例如,对于您的样本数据,'entrada' 有 2 个值,'sopa' 有 2 个值,'plato' 有 2 个值,因此可能有独特的结果计数是 2!*2!*2! = 8 因此,当您的代码执行达到此结果时,代码的执行必须停止。
    • 因此,如果我有可能的唯一结果 3!*5!*7!=3628800,但我只需要 31 种可能的组合,例如 2 月需要 28 种。我该如何做那个限制或限制?感谢您的所有帮助
    猜你喜欢
    • 2015-01-03
    • 2013-06-18
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2012-01-28
    • 2013-01-21
    相关资源
    最近更新 更多