几个表联查,现在的sql是这样,不写DISTINCT会查出多条一样的数据,有更好的写法吗select DISTINCT
T_DEVICES.DEVICEID,T_DEVICES.ASSETNAME,T_DEVICES.PRINCIPAL
from
((T_DEVICES
inner join 
T_DEVICEMODEL
on
T_DEVICES.DEVICEMODELID = T_DEVICEMODEL.DEVICEMODELID)
inner join
T_DEVICETYPE
on
T_DEVICEMODEL.DEVICETYPEID = T_DEVICETYPE.DEVICETYPEID)
inner join
T_DEVICETOPTYPE
on
T_DEVICETYPE.DEVICETOPTYPE = T_DEVICETOPTYPE.DEVICETOPTYPE
where
T_DEVICES.ROOMID = 12001
and
T_DEVICES.BRANCHID = 5
and
T_DEVICETOPTYPE.DEVICETOPTYPE = 1

解决方案 »

  1.   

    如果都一一对应,不需要distinct
    否则就先用子查询查出唯一记录,然后再连接.
    如果都不行,就只能用distinct了.
      

  2.   

    不用加括号,结构写得清析一些SELECT DISTINCT T_DEVICES.DEVICEID,T_DEVICES.ASSETNAME,T_DEVICES.PRINCIPAL 
    FROM T_DEVICES 
    inner join T_DEVICEMODEL on T_DEVICES.DEVICEMODELID = T_DEVICEMODEL.DEVICEMODELID 
    inner join T_DEVICETYPE on T_DEVICEMODEL.DEVICETYPEID = T_DEVICETYPE.DEVICETYPEID 
    inner join T_DEVICETOPTYPE on T_DEVICETYPE.DEVICETOPTYPE = T_DEVICETOPTYPE.DEVICETOPTYPE 
    WHERE T_DEVICES.ROOMID = 12001 and T_DEVICES.BRANCHID = 5 and T_DEVICETOPTYPE.DEVICETOPTYPE = 1 有数据冗余,说明还要加条件,最好你把这几个表的主键都列出来;
    把数据也帖出来
      

  3.   

    我觉得不应该有重复记录,因为我想你的T_DEVICES.DEVICE_ID、T_DEVICEMODEL.DEVICEMODELID 、
    T_DEVICETYPE.DEVICETYPEID 、T_DEVICETOPTYPE.DEVICETOPTYPE 应该是主键,而且应该是
    T_DEVICETOPTYPE.DEVICETOPTYPE是最顶级的,
    依次是T_DEVICETYPE.DEVICETYPEID、T_DEVICEMODEL.DEVICEMODELID、T_DEVICES.DEVICE_ID
    而且还是从顶级开始的一对多的关系,也应该不存在一个T_DEVICES.DEVICE_ID对应多个T_DEVICEMODEL.DEVICEMODELID
    或一个T_DEVICEMODEL.DEVICEMODELID对应多个T_DEVICETYPE.DEVICETYPEID
    或一个T_DEVICETYPE.DEVICETYPEID对应多个T_DEVICETOPTYPE.DEVICETOPTYPE
    这样的话我就想不通为什么会有重复记录了.
    不过,象这样的语句,我一般是这样写的select a.DEVICEID, a.ASSETNAME, a.PRINCIPAL
      from T_DEVICES a, T_DEVICEMODEL b, T_DEVICETYPE c, T_DEVICETOPTYPE d
     where a.DEVICEMODELID = b.DEVICEMODELID
       and b.DEVICETYPEID = c.DEVICETYPEID
       and c.DEVICETOPTYPE = d.DEVICETOPTYPE
       and a.ROOMID = 12001
       and a.BRANCHID = 5
       and d.DEVICETOPTYPE = 1
      

  4.   

    你查出来的重复记录也不是很多,用一下distinct只要对性能不是很大的影响也无所谓三