将内连接的结果限制为1


trpnest
2025-03-18 02:57:19 (21天前)


我有这个架构:

create table ord(id int);
create table orderpos(id int,orderid int,descr varchar(255));

插入ord(id)值(1);
插入ord(id)值(2);
插入订单(id,…

3 条回复
  1. 0# ࿏自ོ༾由ོ༽人͙⃡⌇ | 2019-08-31 10-32



    您可以通过row_number fucntion选择第一行或第一行




    1. 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

    2. </code>

  2. 1# 日耀九洲 | 2019-08-31 10-32



    那是什么

    CROSS APPLY

    是用来:




    1. 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;

    2. </code>


    它是子查询和连接的混合。它允许您为基于行的条件返回多个列和行。



    编辑。因此,注意到它不是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



    文档具有以下语法:




    1. SELECT
      FROM A, LATERAL( SELECT
      FROM B WHERE A.x = B.x ) LDT;

    2. </code>


    所以也许这应该工作:




    1. SELECT
      FROM ord, LATERAL( SELECT TOP 1
      FROM orderpos WHERE orderpos.orderid = ord.id) LDT;

    2. </code>

登录 后才能参与评论