【问题标题】:take a row_number in delete query with where condition在带有 where 条件的删除查询中取一个 row_number
【发布时间】:2013-07-24 11:01:06
【问题描述】:

我有以下 DBTable:

在这个数据库中,有以英语和西班牙语存储的问题。

对于 Language=1 是英语,2 是同一问题的西班牙语翻译。

我在 gridview 中只显示一个针对特定 kiskid 的英语问题

要在 gridview 中显示数据,我使用以下查询:

选择 ROW_NUMBER() OVER (ORDER BY QMID) AS SrNo,question,kioskid 来自 QuestionMaster where Language=1 and KioskID='K1'

这个查询给了我以下数据:

现在我想从上面网格中的数据中进行删除查询,这样当我删除“我可以进来吗?”即 SrNo=1 那么它的相关西班牙语也应该被删除。

由于我通过获取 row_number 生成了 srno,(它不在数据库中)它给我带来了一个问题,即删除该问题的下一个等效西班牙记录。

我尝试在删除查询的位置使用 row_number,但它没有给我结果。

请帮帮我。

【问题讨论】:

  • @TimSchmelter 它在第一张图片(数据库的实际快照)中提到,例如。因为我可以进来,,,它只是进入,,对于两个记录 QMID 是相同的
  • 您是如何尝试删除记录的,参数是什么?您要删除SrNoQMIDQuestion 还是两者的组合?
  • 我可以得到的直接参数是 SrNo,Question 和 Kioskid,,, 但是 srno 没有用,因为它不是 DB 中的实际记录,问题和 kioskid 可以重复@TimSchmelter
  • 您应该规范化您的表格并添加一个Question 表格。然后是LanguageQuestion 之间的关系表。
  • @TimSchmelter 我只是想从数据库中删除问题。我可以进来吗?和下一条记录,即只是进入

标签: c# asp.net sql vb.net sql-server-2008-r2


【解决方案1】:

为什么这不起作用?

delete from QuestionMaster
    where Language = 2 and KioskID = 'K1' and QMID = 1;

如果是因为你没有QMID,你可以这样做:

delete from QuestionMaster
    where Language = 2 and KioskID = 'K1' and
          QMID in (select QMID
                   from QuestionMaster
                   where Language = 1 and question = 'May I come In'
                  )

我不确定row_number() 在做什么。

编辑:

如果您想根据 QMID 删除两个(全部?)记录,请删除 where 中的语言条件 delete

delete from QuestionMaster
    where KioskID = 'K1' and
          QMID in (select QMID
                   from QuestionMaster
                   where Language = 1 and question = 'May I come In'
                  )

【讨论】:

  • 这个唯一的西班牙记录被删除了,我也想删除英文记录
  • 我在子查询中添加和语言=2(从 QuestionMaster 中选择 QMID....),但它不起作用
【解决方案2】:

您不能只从数据库中检索 QMID 并使用该 QMID 删除所有语言的问题吗?

【讨论】:

  • 我猜两者都有一点。据我所知,他对每个问题都有一个 ID (QMID),所以我想知道他为什么不直接用它来删除他的问题。
【解决方案3】:

为什么需要使用 ROW_NUMBER ? Select * from QuestionMaster where Language = 1 不会做同样的工作。

delete from QuestionMaster where QMID = 1 也一样?

【讨论】:

  • 我不想在网格中显示 QMID,只是我被告知要按 ROW_Number 显示每个显示的问题的序列号
  • 所以不显示?您可以隐藏网格中的列。
  • 我也不太确定这个要求。故意滥用关系数据并不是好的设计。
  • 没错——我认为这是一个很好的例子,说明从一个糟糕的设计开始,然后一切都涉及变通方法和修复。我显然不知道情况等等等等,但是添加答案和解决方案只会扩展我认为的问题......
【解决方案4】:

您应该可以在查询中使用QMID

select
     ROW_NUMBER() OVER (ORDER BY QMID) AS SrNo
    ,QMID
    ,question
    ,kioskid
from QuestionMaster
where Language=1 and KioskID='K1'

然后在C#/VB中创建一个绑定对象

public class Question
{
    [DisplayName("Serial Number")]
    public int SrNo { get; set; }

    [Browsable(false)]
    public int QMID { get; set; }

    public string Question { get; set; }

    public int KioskId { get; set; }
}

BrowsableAttribute 表示该列不应显示在您的 DataGridView 中。

这样你的删除更容易。

delete from QuestionMaster where QMID = @QMID

【讨论】:

  • 谢谢,但是,如果我被允许在查询(gridview)中输入 QMID,工作会容易得多。我不允许这样做。
  • 所以回到告诉你你不能的人并解释他们的方式错误。也许比这更外交一点。出于兴趣,它背后的原因是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多