E、 SQLAnywhere、IQ、Advantage)以及版本。@为了避免重复记录,我们只想选择第一条记录。我用这个版本更新了我的帖子。你没有重复的。如果您只希望orderid=1有一条记录,则必须决定要保留哪一条记录。”“第一张唱片”没有意义,因为没有

E、 SQLAnywhere、IQ、Advantage)以及版本。@为了避免重复记录,我们只想选择第一条记录。我用这个版本更新了我的帖子。你没有重复的。如果您只希望orderid=1有一条记录,则必须决定要保留哪一条记录。”“第一张唱片”没有意义,因为没有,sql,inner-join,limit,sybase,Sql,Inner Join,Limit,Sybase,E、 SQLAnywhere、IQ、Advantage)以及版本。@为了避免重复记录,我们只想选择第一条记录。我用这个版本更新了我的帖子。你没有重复的。如果您只希望orderid=1有一条记录,则必须决定要保留哪一条记录。”“第一张唱片”没有意义,因为没有顺序。那么,您如何决定要保留哪一个记录呢?另外,您是否尝试过@BHouse建议的方法?我有多个记录用于同一ord,每个描述一个(一个用于“huba”,一个用于“blub”)。我知道,如果我不指定一个,就不会有订单。但这对我的商业案例并不重要。不




E、 SQLAnywhere、IQ、Advantage)以及版本。@为了避免重复记录,我们只想选择第一条记录。我用这个版本更新了我的帖子。你没有重复的。如果您只希望orderid=1有一条记录,则必须决定要保留哪一条记录。”“第一张唱片”没有意义,因为没有顺序。那么,您如何决定要保留哪一个记录呢?另外,您是否尝试过@BHouse建议的方法?我有多个记录用于同一ord,每个描述一个(一个用于“huba”,一个用于“blub”)。我知道,如果我不指定一个,就不会有订单。但这对我的商业案例并不重要。不,BHouse的建议太复杂了,用我的sql知识无法理解。对于这么小的任务来说,这似乎相当复杂?我尝试过,但我没有用我的实际示例实现该解决方案,该示例使用了大约5个其他联接。即使我简化了我的查询,我总是在关键字“WITH”附近得到“不正确的语法”,所以这个函数在这个db版本中可能不可用?@GarfieldKlon如果你能给我发送准确的查询(如果可能的话),我会为你编写它。如果在with子句之前声明了任何变量,则应以结尾;您也可以将此解决方案用作子查询,而不是CTE。@GarfieldKlon;现在这篇文章已经更新,包含了您的RDBMS(即Sybase ASE),这就解释了“语法错误”错误使用x作为(…)'在Sybase ASE中无效;“row_number()over()”构造也会出现语法错误。。。Sybase中也不支持这对于这么小的任务来说似乎相当复杂?我尝试过,但我没有用我的实际示例实现该解决方案,该示例使用了大约5个其他连接。即使我简化了我的查询,我总是在关键字“WITH”附近得到“不正确的语法”,所以这个函数在这个db版本中可能不可用?@GarfieldKlon如果你能给我发送准确的查询(如果可能的话),我会为你编写它。如果在with子句之前声明了任何变量,则应以结尾;您也可以将此解决方案用作子查询,而不是CTE。@GarfieldKlon;现在这篇文章已经更新,包含了您的RDBMS(即Sybase ASE),这就解释了“语法错误”错误使用x作为(…)'在Sybase ASE中无效;“row_number()over()”构造也会出现语法错误。。。Sybase ASEHm中也不支持,但似乎不起作用,因为我有其他内部连接。我收到消息:Adaptive Server无法执行请求的操作,因为列“productId”不在联接表的范围内expression@GarfieldKlon对不起我的英语。我编辑查询。请再试一次。谢谢你,Okdel,这似乎有效。这依赖于主键(op2.id交叉应用在Sybase ASE中无效语法;虽然横向联接在Sybase SQLAnywhere中有效,但在Sybase ASE中无效[注:Sybase名称下有4种不同的RDBMS产品:ASE、SQLAnywhere、IQ、Advantage]@markp抱歉,我意识到了这一点,并在您评论时正确地编辑了我的问题:| Evaldas:对不起,也是;您在编辑时也在键入:-)
交叉应用
在Sybase ASE中是无效语法;虽然横向联接在Sybase SQLAnywhere中有效,但在Sybase ASE中无效[注:Sybase名称下有4种不同的RDBMS产品:ASE、SQLAnywhere、IQ、Advantage]@markp抱歉,我意识到了这一点,并在您评论时正确地编辑了我的问题:| Evaldas:对不起,也是;您在编辑时也在键入:-)谢谢您提供详细的解决方案。如果我尝试您的第一种方法,并且在表中的3个from之后是一些其他内部联接,我将收到错误消息:Adaptive Server无法执行请求的操作,因为列“abcid”不在联接表表达式的范围内。我刚刚在“from”之后和“where”子句之前添加了一些内部联接(例如,o.abcid=a.id上的内部联接abca),是否必须将所有表从内部联接添加到from并在where子句中添加条件?我设法用您的方法解决了我的问题。我必须将连接的表移动到from和on条件,然后移动到where等,这样就可以工作了。谢谢。谢谢你的详细解决方案。如果我尝试您的第一种方法,并且在表中的3个from之后是一些其他内部联接,我将收到错误消息:Adaptive Server无法执行请求的操作,因为列“abcid”不在联接表表达式的范围内。我刚刚在“from”之后和“where”子句之前添加了一些内部联接(例如,o.abcid=a.id上的内部联接abca),是否必须将所有表从内部联接添加到from并在where子句中添加条件?我设法用您的方法解决了我的问题。我不得不去
create table ord(id int);
create table orderpos(id int, orderid int, descr varchar(255));

insert into ord(id) values (1);
insert into ord(id) values (2);
insert into orderpos(id, orderid, descr) values(1,1,'huba');
insert into orderpos(id, orderid, descr) values(2,1,'blub');
insert into orderpos(id, orderid, descr) values(3,2,'foo');
id
1
2
id  orderid descr
1   1       huba
2   1       blub
3   2       foo
oId opId    orderid   descr
1   1       1         huba
2   3       2         foo
select o.id as oId, op.id as opId, op.orderid, op.descr from ord o
inner join orderpos op on op.orderid = o.id;
oId opId    orderid   descr
1   1       1         huba
1   2       1         blub
2   3       2         foo
select o.id as oId, op.id as opId, op.orderid, op.descr 
from ord o
inner join (select * from orderpos op2 group by op2.orderid) op on op.orderid = o.id;
select
  o.id as oId,
  op.id as opId,
  op.orderid,
  op.descr
from
  ord o inner join
  orderpos op 
on
  op.orderid = o.id and
  not exists
    (select 1 from orderpos op2 where op2.orderid = o.id and op2.id < op.id)
WITH x
AS (
    SELECT o.id AS oId
        ,op.id AS opId
        ,op.orderid
        ,op.descr
        ,row_number() OVER (
            PARTITION BY orderid ORDER BY orderid
            ) rows
    FROM ord o
    INNER JOIN orderpos op
        ON op.orderid = o.id
    )
SELECT otd
    ,opid
    ,orderid
    ,DESC
FROM x
WHERE row = 1
select  o.id        as oId,
        op.id       as opId,
        op.orderid,
        op.descr

from    ord      o,
        orderpos op,

        (select op2.orderid,
                max(op2.descr) as descr
        from    orderpos op2
        group by op2.orderid
        ) dt

where   op.orderid = o.id
and     op.orderid = dt.orderid
and     op.descr   = dt.descr
order by 1,2
go

 oId     opId    orderid  descr
 ------- ------- -------- ----------
       1       1        1 huba
       2       3        2 foo
select  o.id        as oId,
        op.id       as opId,
        op.orderid,
        op.descr

from    ord      o,
        orderpos op

where   op.orderid = o.id
and     op.descr = (select      max(op2.descr)
                        from    orderpos op2
                        where   op2.orderid = op.orderid)
order by 1,2
go

 oId     opId    orderid  descr
 ------- ------- -------- ----------
       1       1        1 huba
       2       3        2 foo
SELECT o.id as oId, op.id as opId, op.orderid, op.descr 
FROM ord AS o
CROSS APPLY (   SELECT TOP (1) *
                FROM orderpos AS op
                WHERE op.orderid = o.id
                ORDER BY op.id) AS op;
SELECT *
FROM A, LATERAL( SELECT * FROM B WHERE A.x = B.x ) LDT;
SELECT *
FROM ord, LATERAL( SELECT TOP 1 * FROM orderpos WHERE orderpos.orderid = ord.id) LDT;