如何删除SQL查询中的重复项?(我也可以用PHP实现)
因此,我正在编写一个PHP脚本,用于删除此SQL查询的重复条目: SQL:如何删除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
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子句。