Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地进行SQL连接?_Sql_Join_Greatest N Per Group - Fatal编程技术网

如何有效地进行SQL连接?

如何有效地进行SQL连接?,sql,join,greatest-n-per-group,Sql,Join,Greatest N Per Group,我有两张桌子 命令 复制 单个订单记录可以有多个复制记录。我希望联接这两个表,这样即使存在多个记录,我也总是从联接中检索一个记录。 样本数据 Replication table: ORDID | STATUS | ID | ERRORMSG | HTTPSTATUS | DELIVERYCNT ========================================================= 1717410307 1 JBM-9e92ae0c NULL

我有两张桌子

  • 命令
  • 复制
  • 单个订单记录可以有多个复制记录。我希望联接这两个表,这样即使存在多个记录,我也总是从联接中检索一个记录。 样本数据

    Replication table:
    ORDID     | STATUS | ID | ERRORMSG | HTTPSTATUS | DELIVERYCNT
    =========================================================
    
    1717410307      1   JBM-9e92ae0c  NULL       200   1 
    ----------
    1717410307      1   JBM-9fb59af1  NULL       400   -99
    ----------
    1717410308      1   JBM-0764b091  NULL       403   1
    ----------
    1717410308      1   JBM-0764b091  NULL       200   1
    

    订单表:

    ORDID | ORDTYPE | DATE
    ----------
    1717410307  CAR 22-SEP-2011
    1717410308  BUS 23-SEP-2011
    
    如何有效地进行连接,以便在order表和复制表中获得尽可能多的记录,并根据优先级动态选择这些记录

    优先级可定义为:

  • 传递计数为-99的任何记录
  • HTTPSTATUS!=二百
  • 请指导我如何继续加入

    如果您需要任何澄清,请告诉我


    非常感谢你的帮助

    是否可以基于
    HTTPSTATUS
    DELIVERYCNT
    使用
    ORDER BY
    子句

    在这种情况下,您可以编写一个特定的
    ORDER BY
    并从中获取
    TOP 1
    (不知道您使用的是哪种RDBMS)或获取
    行号()作为RowN,其中RowN=1
    但这是一个丑陋(但很快)的解决方案

    另一个选项是创建一个子查询,在其中添加一个新列,该列将进行优先级计算


    < >为了使查询有效,您应该考虑索引(或使用RDBMS特定解决方案,如包含的列)

    以及如果您具有多个-99和http!200?空HTTPSTATUS是否符合
    HTTPSTATUS!=200
    ?通常,a
    NULL!=200
    产生
    NULL
    表示将不选择该行。您使用的数据库引擎和版本是什么?添加了[best-n-per-group]标记。