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

How to get unique values from two different tables?

我有两个表: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


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

这是我面临的情况: 执行不同的 im 后得到如下结果:

Item Store
1     8
2     8
3     8

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

Item Store
1     8
2     15
3     53

也就是说,它应该对所有行都是唯一的,但我无法实现。请推荐。

编辑:

Table 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  


Table 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**

看来你应该简单地做:

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 中包含 discontinued 标志,而不是将它们包含在连接中,然后使用 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