如何删除SQL查询中的重复项?(我也可以用PHP实现)

如何删除SQL查询中的重复项?(我也可以用PHP实现),php,mysql,sql-server,Php,Mysql,Sql Server,因此,我正在编写一个PHP脚本,用于删除此SQL查询的重复条目: SQL: SELECT DISTINCT a.pname, a.pnumber, a.plocation, CASE WHEN a.plocation = b.dlocation then 'Local' ELSE 'Remote' END AS ptype FROM PROJECT a LEFT JOIN DEPT_LOCATIONS b on a.dnum = b.dnumber orde

因此,我正在编写一个PHP脚本,用于删除此SQL查询的重复条目:

SQL:

SELECT DISTINCT a.pname, a.pnumber, a.plocation, 
    CASE WHEN a.plocation = b.dlocation then 'Local'
         ELSE 'Remote' 
    END AS ptype
FROM PROJECT a LEFT JOIN DEPT_LOCATIONS b on a.dnum = b.dnumber
order by a.pnumber;
PNAME PNUMBER PLOCATION PTYPE --------------- ---------- --------------- ------ ProductX 1 Bellaire Local ProductX 1 Bellaire Remote ProductY 2 Sugarland Local ProductY 2 Sugarland Remote ProductZ 3 Houston Local ProductZ 3 Houston Remote Computerization 10 Stafford Local Reorganization 20 Houston Local Newbenefits 30 Bellaire Remote Virtualization 40 Houston Local Virtualization 40 Houston Remote CRM 50 Stafford Local Bladeservers 60 Houston Local 输出:

SELECT DISTINCT a.pname, a.pnumber, a.plocation, 
    CASE WHEN a.plocation = b.dlocation then 'Local'
         ELSE 'Remote' 
    END AS ptype
FROM PROJECT a LEFT JOIN DEPT_LOCATIONS b on a.dnum = b.dnumber
order by a.pnumber;
PNAME PNUMBER PLOCATION PTYPE --------------- ---------- --------------- ------ ProductX 1 Bellaire Local ProductX 1 Bellaire Remote ProductY 2 Sugarland Local ProductY 2 Sugarland Remote ProductZ 3 Houston Local ProductZ 3 Houston Remote Computerization 10 Stafford Local Reorganization 20 Houston Local Newbenefits 30 Bellaire Remote Virtualization 40 Houston Local Virtualization 40 Houston Remote CRM 50 Stafford Local Bladeservers 60 Houston Local PNAME PNUMBER PLOCATION PTYPE --------------- ---------- --------------- ------ ProductX 1 Bellaire本地 ProductX 1 Bellaire遥控器 多产2 Sugarland本地酒店 ProductY 2 Sugarland遥控器 ProductZ 3休斯顿本地 ProductZ 3休斯顿遥控器 计算机化10斯塔福德本地 重组20休斯顿当地 Newbenefits 30 Bellaire遥控器 虚拟化40休斯顿本地 虚拟化40休斯顿远程 CRM 50斯塔福德本地酒店 布拉德斯沃斯60休斯顿当地
问题是有时结果显示本地和远程。我想要它,这样如果有本地的,遥控器就不会显示。这是SQL中的一种可能性,还是我必须在PHP中这样做?

我想你是说如果有
Local
行,你想看到它,否则你想看到
Remote
行。如果这是正确的,您可以这样做,利用
Local
的值小于
Remote
的事实。我们将使用带有
MIN()
的聚合查询来完成此操作

SELECT pname, pnumber, plocation, MIN(ptype) AS ptype
  FROM (
        SELECT a.pname, a.pnumber, a.plocation, 
               CASE WHEN a.plocation = b.dlocation then 'Local'
                                                   ELSE 'Remote' 
                END AS ptype
          FROM PROJECT a 
          LEFT JOIN DEPT_LOCATIONS b on a.dnum = b.dnumber
        ) AS q
 GROUP BY pname, pnumber, plocation
 ORDER BY pnumber

这句话真正解决了我的问题:

 WITH CTE AS 
 (SELECT x.PNAME, x.PNUMBER, x.PLOCATION, PTYPE, ROW_NUMBER() OVER (Partition by PNAME order by PTYPE) R
 FROM (SELECT prj.pname, prj.pnumber, prj.plocation, CASE WHEN plocation = dlocation then 'Local' ELSE 'Remote' END AS 
 ptype FROM Project prj JOIN DEPT_LOCATIONS dept on prj.dnum = dept.dnumber) x )
 SELECT PNAME, PNUMBER, PLOCATION, PTYPE
 FROM CTE
 WHERE R = 1
 ORDER BY PNUMBER;

要么dnumber不是唯一的,两个零件号可能有相同的dnumber,要么一个零件号可能在不同的行上显示不同的dnumber,那么是哪一个呢?好主意,我正在考虑使用union和not exists子句。