如何从两个不同的表中获取唯一值?
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
我有两个表: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