内部联接上的记录重复

时间:2018-08-27 18:57:14

标签: php mysql sql

我正在迁移一个将数据从MySQL数据库拉到SQL数据库的项目。问题是我遇到了重复的记录,当我使用MySQL数据库时,这些记录能够快速解决。另一方面,SQL给了我一些问题。

我有两个表:AllOrderData和CallSettings

两个表都有一个标记为OrderNumber的列。有时,两个表上的多个记录具有相同的OrderNumber。在这种情况下,我只需要显示一条记录即可。

这就是我现在拥有的:

$dt = $_GET ["dt"];

$sql = "SELECT
  A.OrderNumber,
  A.DetailShipDate,
  A.ETC,
    C.OrderNumber,
    C.ETC
FROM AllOrderData A
INNER JOIN CallSettings C ON A.OrderNumber = C.OrderNumber
WHERE A.DetailShipDate = '$dt'";

我试图添加DISTINCT以及GROUP BY,但是我已经阅读了它们用于不同的行的情况,只是不起作用。

当我使用MySQL时,我将所有数据都放在一个表中。不幸的是,这不再是一个选择,但是查询非常简单:

$sql_string = "SELECT * FROM orders WHERE DetailShipDate='$dt' group by Order_Number

我尝试了以下操作:

 $sql = "SELECT x.OrderNumber,
                x.EnteredBy,
                x.Order_Number,
                x.Contact_Name
   FROM (SELECT A.OrderNumber,
                A.EnteredBy,
                C.Order_Number,
                C.Contact_Name
                row_number() OVER (PARTITION BY A.OrderNumber
                                   ORDER BY C.Order_Number) rn
                FROM AllOrderData A
                     INNER JOIN CallSettings C
                                ON A.OrderNumber = C.Order_Number
                WHERE A.DetailShipDate = '$dt') x
   WHERE x.rn = 1;";

出现此错误:

查询准备/执行中的错误。数组([0] =>数组([0] => 42000 [SQLSTATE] => 42000 [1] => 102 [代码] => 102 [2] => [Microsoft] [SQL Server Native Client 11.0] [SQL Server]'('..附近的语法不正确。[message] => [Microsoft] [SQL Server Native Client 11.0] [SQL Server]'('。)附近的语法不正确

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()。按订单号进行分区和排序。

SELECT x.ordernumber,
       x.detailshipdate,
       x.etc,
       x.ordernumber,
       x.etc
       FROM (SELECT a.ordernumber,
                    a.detailshipdate,
                    a.etc,
                    c.ordernumber,
                    c.etc,
                    row_number() OVER (PARTITION BY c.ordernumber
                                       ORDER BY c.ordernumber) rn
                    FROM allorderdata a
                         INNER JOIN callsettings c
                                    ON a.ordernumber = c.ordernumber
                    WHERE a.detailshipdate = ?) x
       WHERE x.rn = 1;