内部联接创建重复记录

时间:2018-05-08 08:42:52

标签: sql

为什么这个内连接会创建重复项?

SELECT 
    AU.sProdCode, AU.sProdName
FROM 
    AllowedUsers AU
INNER JOIN 
    ProdMaster PM ON AU.sProdCode = PM.sProdCode
WHERE
    PM.sProdStatus = 'pending' AND
    AU.sUserCode = 'TM001'

如何摆脱重复的问题?

ProdMaster

sProdCode   sProdName   sProdStatus
-----------------------------------
1001        MyProduct   Pending

AllowedUsers

sProdCode   sProdName   sUserCode
----------------------------------
1001        MyProduct   TM001

我的状况

  1. 如果产品状态为待定(在ProdMaster中)
  2. 允许用户查看产品(在允许的用户 - 用户代码中)
  3. 显示产品代码/产品名称,无重复。

2 个答案:

答案 0 :(得分:1)

显然,你有重复的行,大概是在第二个表中。

最有效的方法是exists

SELECT AU.sProdCode, AU.sProdName
FROM AllowedUsers AU
WHERE EXISTS (SELECT 1
              FROM ProdMaster PM 
              WHERE AU.sProdCode = PM.sProdCode AND PM.sProdStatus = 'pending'
             )
WHERE AU.sUserCode = 'TM001';

为获得最佳效果,您需要ProdMaster(sProdCode, sProdStatus)AllowedUsers(sUserCode, sProdName)上的索引。

如果您仍然在重复,那么您在AllowedUsers中已经重复了。在这种情况下,请使用SELECT DISTINCT

答案 1 :(得分:0)

只需使用下面的distinct:

SELECT distinct AU.sProdCode,AU.sProdName
FROM AllowedUsers AU
inner JOIN ProdMaster PM
ON AU.sProdCode = PM.sProdCode
where PM.sProdStatus = 'pending' and
AU.sUserCode = 'TM001'

原因是你在表格中会有一对多的关系。