使用新行替换多个匹配行的SQL查询

时间:2011-10-03 16:09:12

标签: sql postgresql

为简单起见,假设我有一个包含一列的SQL表,其中包含数字数据。样本数据是

11
13
21
22
23
3
31
32
33
41
42
131
132
133
141
142
143

如果表中包含x1,x2,x3形式的所有数字,但不包括x(其中x是数字的所有数字,但最后一位数。所以对于123456,x将是12345),那么我想要用新行x替换这三行。

上述数据的理想输出为:

11
13
2
3
31
32
33
41
42
131
132
133
14

我如何用SQL实现这一目标?我应该提一下,我不想永久改变数据 - 只是为了查询结果。 感谢。

2 个答案:

答案 0 :(得分:2)

我假设

  • 函数的存在:lastDigithead分别产生最后一位数字和其余输入值

  • 数据是唯一的

  • 只有数字1,2,3用于构造表值

  • 该表名为t,并且只有一列x

  • 你不希望这个递归地工作

  • 像这样创建一个视图nselect head(x) h, lastDigit(x) last from t您可以使用内嵌视图

  • 创建一个像这样的视图

    选择h 从n h组 有计数(*)= 3

然后这应该给出所需的结果:

select distinct x 
from (
    select x from t where head(x) not in (select h from c)
    union
    select h from c
)

答案 1 :(得分:0)

您需要两个SQL命令,一个用于删除现有行,另一个用于添加新行。它们看起来像这样(其中:X是一个包含基数的参数,在您的示例中为14):

 DELETE FROM YourTable WHERE YourColumn BETWEEN (:X*10) AND ((:X*10) + 9)

 INSERT INTO YourTable (YourColumn) VALUES (:X)

注意:我假设您希望删除x0到x9中的所有数字,这就是我上面写的内容。如果你真的只想删除x1,x2,x3,那么你将使用这个DELETE语句:

 DELETE FROM YourTable WHERE YourColumn BETWEEN ((:X*10) + 1) AND ((:X*10) + 3)