如何从两个不同的表中获取唯一值?

时间:2021-05-23 16:30:34

标签: sql oracle rdbms

我有两张桌子:T1 和 T2。我感兴趣的列是 T1 中的“Item”和 T2 中的“Store”。

这是我的查询和我尝试过但可以得到想要的结果的几个选项:

Query1: (very time consuming - Its oracle DB)

select distinct  T1.Item,T2.Store from
(select distinct * from T1) T1
full outer join 
(select distinct * from T2)T2
on T1.ITEM_ID=T2.ITEM_ID 

Query2: (This is so close to the result I need but i'm stuck with max of item value instead of the whole picture)

select max(T1.ITEM),T2.Store from T1 , T2 
where  T1.ITEM_ID=T2.ITEM_ID
group by T2.Store


我正在尝试为两列获取唯一的行值

这是我面临的场景: 做不同的我得到如下结果后:

Item Store
1     8
2     8
3     8

但我想要的结果是(每家商店 1 件商品):

Item Store
1     8
2     15
3     53

也就是说,它对于所有行都应该是唯一的,但我无法实现。请提出建议。

编辑:

表 T1:

ID         Item  ITEM_ID    CREATE_DATE          UPDATE_DATE          
---------  ---------------  ---------  -------------------  -------------------  
123           8    1       2021-05-21 21:08:14  2021-05-21 21:08:14  
15           15    7      2021-05-22 14:15:49  2021-05-22 14:15:49  


表 T2:

Store      ITEM_ID      Itemsale       Status   
8          1             (null)          C      
65         87            (null)          C      

我的情况的解决方案

**select T1.Item,T2.Store 
from
(SELECT  Item, DENSE_RANK() OVER (ORDER BY Item )  rnk from T1 group by Item   ) T1
inner join 
(SELECT Store ,DENSE_RANK() OVER (ORDER BY Store )  rnk  from T2 group by Store ) T2
on T1.rnk=T2.rnk**

1 个答案:

答案 0 :(得分:1)

看来您应该只是这样做:

select distinct  T1.Item, T2.Store 
from T1
  inner join T2 on T1.ITEM_ID = T2.ITEM_ID 

或“包括在任何商店都找不到的商品”:

select distinct  T1.Item, T2.Store 
from T1
  left outer join T2 on T1.ITEM_ID = T2.ITEM_ID 

或“包括空商店”

select distinct  T1.Item, T2.Store 
from T1
  right outer join T2 on T1.ITEM_ID = T2.ITEM_ID 

执行此连接所需的时间取决于索引了哪些列、有多少行以及您与服务器的连接。对于 3 行,它应该合理地为毫秒

如果有其他东西可用于删除重复项(不同的除外),您应该利用它(例如,如果项目具有“已停止”标志,并且它们被另一个具有相同名称的项目替换,您应该希望在 where/on 中包含已停止的标志,而不是将它们包含在连接中,然后使用 DISTINCT 将它们清除)


如果你的意思是你只想要“每个产品交叉与每个商店结合”,那就是;

select distinct  T1.Item, T2.Store 
from T1
  cross join T2 

要在假 ID 上加入商品和商店,这意味着商品被分配到商店,每个商店一件商品,按某种顺序,您可以这样做..

select T1.Item,T2.Store
from
  (select item, row_number() over(order by Item) r from T1 group by item) T1
  inner join 
  (select store, row_number() over(order by store) r from T2 group by store) T2
  on T1.R = T2.R 
相关问题