复合主键上的sql server比较 predicate

yeotifhr  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(287)

在SQLServer中,假设我有一个表 Mytable 使用复合主键 [ColA, ColB, ColC] . 我要执行以下伪查询:

select * from Mytable where (ColA,ColB,ColC) > (SomeValA,SomeValB,SomeValC)

这有可能吗?
编辑:示例:

create table Mytable (a integer, b integer, c integer);
insert into Mytable values (1,1,1),(1,1,2),(1,2,1),(2,1,1);

select * from Mytable where (a,b,c) > (1,1,2) 应返回行(1,2,1)和(2,1,1)
编辑2:让我重新表述一下:如果可以在表的列的有序子集上定义total order函数,那么有没有一种方法可以使用这个order函数作为 predicate 来查询表?

r7xajy2e

r7xajy2e1#

我怀疑这就是你想要的:

--Sample Table
CREATE TABLE dbo.YourTable (ColA int,
                            ColB int,
                            ColC int);

--Sample Data    
WITH N AS
    (SELECT N
     FROM (VALUES (1),
                  (2),
                  (3),
                  (4),
                  (5),
                  (6),
                  (7),
                  (8),
                  (9),
                  (10)) N (N) )
INSERT INTO dbo.YourTable (ColA,
                           ColB,
                           ColC)
SELECT N1.N,
       N2.N,
       N3.N
FROM N N1,
     N N2,
     N N3;
GO

--Solution
DECLARE @I1 int,
        @I2 int,
        @I3 int;
SET @I1 = 5;
SET @I2 = 7;
SET @I3 = 2;

SELECT YT.ColA,
       YT.ColB,
       YT.ColC
FROM dbo.YourTable YT
WHERE YT.ColA > @I1
   OR (YT.ColA = @I1 AND YT.ColB > @I2)
   OR (YT.ColA = @I1 AND YT.ColB = @I2 AND YT.ColC > @I3)
ORDER BY YT.ColA,
         YT.ColB,
         YT.ColC;

GO

--Clean up
DROP TABLE dbo.YourTable;

否则,我要回复我的评论:“简言之:不。 > 两边都需要标量值 (ColA, ColB, ColC) > (@I1, @I2, @I3) 不是价值。sql不按元组排序;这包括 ORDER BY . 语法,例如 ORDER BY (ColA, ColB, ColC), OtherColumn 也会出错。

bihw5rsg

bihw5rsg2#

可能最简单的就是做数学。即:

select * 
from myTable
where (a * 100) + (b * 10) + c > 112;
0ve6wy6x

0ve6wy6x3#

如果要使用索引,则可能需要:

select *
from Mytable 
where a > 1 
union all
select *
from Mytable 
where a = 1 and b > 1 
union all
select *
from Mytable 
where a = 1 and b = 1 and c > 2;

您还可以添加持久化的计算列和索引:

alter table MyTable add abc
    concat(format(a, '00000'), ':', format(b, '00000'), ':', format(c, '00000')) persisted;

create index idx_mytable_abc as mytable(abc);

然后比较如下:

where abc > '00001:00001:00002'

这可以使用索引。

相关问题