我有这个架构:
create table ord(id int);create table orderpos(id int,orderid int,descr varchar(255));
插入ord(id)值(1);插入ord(id)值(2);插入订单(id,…
您可以通过row_number fucntion选择第一行或第一行
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
那是什么 CROSS APPLY 是用来:
CROSS APPLY
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;
它是子查询和连接的混合。它允许您为基于行的条件返回多个列和行。
编辑。因此,注意到它不是SQL Server的请求 CROSS APPLY 不起作用,但这通常被称为a LATERAL JOIN ,似乎受Sybase支持: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/dbreference/from-statement.html
LATERAL JOIN
文档具有以下语法:
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;