在sql查询中获取重复项

在sql查询中获取重复项,sql,oracle,Sql,Oracle,正在尝试使用以下查询创建仪表板- select a.distinct_id, trunc(a.dte) Transaction_Date, a.dte, a.activity, a.part, a.loading, a.user_name, a.device, a.fromloc, a.toloc, a.to_area,

正在尝试使用以下查询创建仪表板-

select a.distinct_id, 
       trunc(a.dte) Transaction_Date, 
       a.dte, 
       a.activity, 
       a.part, 
       a.loading, 
       a.user_name, 
       a.device, 
       a.fromloc, 
       a.toloc, 
       a.to_area, 
       b.NAME||' '||b.Surname Name, 
       a.qty, 
       DECODE(d.workarea, 'Tables','Wood','Metal')Material
from table a,  table b, table c, table d
where (a.toloc = d.storage 
  and a.part = c.part and c.region = 'Country1' 
  and a.dte > trunc(sysdate) - '9' 
  and a.region = 'Country1' 
  and a.activity = 'IDENTIFY' 
  and a.user_name = b.user_name 
  and d.maxarea <> 0 )
选择一个不同的\u id,
trunc(a.dte)交易日,
a、 dte,
a、 活动,
a、 部分,,
a、 装载,
a、 用户名,
a、 装置,
a、 fromloc,
a、 托洛克,
a、 到(u)地区,,
b、 姓名,
a、 数量,
解码(d.工作区、“桌子”、“木头”、“金属”)材料
来自表a、表b、表c、表d
式中(a.toloc=d.storage
a.part=c.part,c.region=Country1
和a.dte>trunc(sysdate)-'9'
a.region='Country1'
和a.activity='IDENTIFY'
a.user\u name=b.user\u name
和d.max0)

当我从where语句(即d.maxarea 0)中删除最后一个约束时,输出不会显示重复,但当我再次将其添加到查询中时,它会显示具有相同不同id的重复记录。

您的查询应该这样写:

select a.distinct_id, trunc(a.dte) as Transaction_Date, a.dte, a.activity, a.part, a.loading, a.user_name, a.device, a.fromloc, a.toloc, a.to_area,
       (b.NAME||' '||b.Surname Name), a.qty,
       (case when d.workarea = 'Tables' then 'Wood' else 'Metal' end) as Material   
from a join
     b
     on a.user_name = b.user_name join
     c
     on a.part = c.part join
     d
     on a.toloc = d.storage
where c.region = 'Country1' and
      a.dte > trunc(sysdate) - interval '9' day and
      a.region = 'Country1' and
      a.activity = 'IDENTIFY' and
      d.maxarea <> 0;
选择a.distinct\u id、trunc(a.dte)作为事务日期、a.dte、a.activity、a.part、a.loading、a.user\u name、a.device、a.fromloc、a.toloc、a.to\u区域,
(b.姓名| |“”| | | b.姓氏名称),a.数量,
(当d.工作区=‘桌子’然后是‘木头’或‘金属’端时的情况)作为材料
从一个连接
B
在a.user\u name=b.user\u name上加入
C
在a.part=c.part连接上
D
在a.toloc=d.storage上
其中c.region='Country1'和
a、 dte>trunc(系统日期)-间隔“9”天和
a、 地区='Country1'和
a、 活动=‘识别’和
d、 最大面积0;
我不确定您的实际问题是什么,但您应该学习编写查询的正确方法:

  • 切勿在
    FROM
    子句中使用逗号。始终使用正确、明确、标准的连接语法
  • decode()
    是特定于数据库的。标准逻辑是
    案例

如果需要不同的行,则需要在代码中添加不同的行 如

选择不同的a.DISTINCT\u id、trunc(a.dte)事务处理日期、a.dte、a.activity、a.part、,
a、 加载,a.用户名,a.设备,a.fromloc,a.toloc,a.to_区域,b.名称| |''b.姓氏
名称、a.数量、解码(d.工作区、“桌子”、“木头”、“金属”)材料
来自表a、表b、表c、表d
哪里
(a.toloc=d.storage和a.part=c.part和c.region='Country1'和a.dte>
trunc(sysdate)-'9'和a.region='Country1'和a.activity='IDENTIFY'和
a、 user\u name=b.user\u name和d.maxarea(0)

不过,我建议使用SQL92中的联接,而不是SQL89格式,以便于阅读

不要在问题标题中使用“please xxx”。解释了为什么在执行隐式联接操作时可以有重复项。您好,欢迎使用堆栈溢出。请阅读-你会得到更好的回答。对于SQL问题,如果您以SQLFiddle的形式显示模式、示例数据、实际结果和预期结果,这将非常有帮助。
  SELECT DISTINCT a.distinct_id, trunc(a.dte) Transaction_Date, a.dte, a.activity, a.part, 
  a.loading, a.user_name, a.device, a.fromloc, a.toloc, a.to_area, b.NAME||' '||b.Surname 
  Name, a.qty, DECODE(d.workarea, 'Tables','Wood','Metal')Material

  from table a,  table b, table c, table d

  where 
  (a.toloc = d.storage and a.part = c.part and c.region = 'Country1' and a.dte > 
   trunc(sysdate) - '9' and a.region = 'Country1' and a.activity = 'IDENTIFY' and 
  a.user_name = b.user_name and d.maxarea <> 0 )