oracle sql:通过具有
我有两张桌子A和B 两个表都有一个列Prod_id,即两个表可以在该列上连接,如oracle sql:通过具有,sql,oracle,Sql,Oracle,我有两张桌子A和B 两个表都有一个列Prod_id,即两个表可以在该列上连接,如 A.Prod_id = B.Prod_id Prod_Id不是这两个表中任何一个表的主键。这两个表都有不同的主键列 产品id列具有以下值: prod_id -------------- 111 222 111 333 222 prod_id -------------- 111 222 111 111 333 222 333 B Prod_id列具有以下值: prod_id -------------- 111
A.Prod_id = B.Prod_id
Prod_Id不是这两个表中任何一个表的主键。这两个表都有不同的主键列
产品id列具有以下值:
prod_id
--------------
111
222
111
333
222
prod_id
--------------
111
222
111
111
333
222
333
B Prod_id列具有以下值:
prod_id
--------------
111
222
111
333
222
prod_id
--------------
111
222
111
111
333
222
333
与表中同一产品标识的行数相比,表中任何产品标识的行数总是更多111333行或相同222行
我必须写一个查询来找出那些B表的行数比a表的行数多的产品id
我在where子句中使用其他列时必须使用其他条件。但这些都与此无关
你能帮帮我吗?我是SQL新手。试试这个:
SELECT b.prod_id
FROM (
SELECT prod_id, COUNT(*) AS prodCount
FROM tableA
GROUP BY prod_id
) a
INNER JOIN (
SELECT prod_id, COUNT(*) AS prodCount
FROM tableB
GROUP BY prod_id
) b ON a.prod_id = b.prod_id
WHERE b.prodCount > a.prodCount
这将获取表A中每个产品标识的计数,在表B中,通过产品标识将它们连接起来,并验证哪些产品标识在B中出现的次数比在A中出现的次数多
正如Gordon所建议的,这里的版本考虑了tat tableA没有产品id记录的可能性:
SELECT b.prod_id
FROM (
SELECT prod_id, COUNT(*) AS prodCount
FROM tableA
GROUP BY prod_id
) a
RIGHT JOIN (
SELECT prod_id, COUNT(*) AS prodCount
FROM tableB
GROUP BY prod_id
) b ON a.prod_id = b.prod_id
WHERE b.prodCount > a.prodCount
OR a.prod_id IS NULL
对于这些记录,a.prod_将为NULL,因为我们正在进行正确的连接
假设您的主键名为pk,这将生成您想要的结果:
select
b.prod_id,
count(distinct a.pk),
count(distinct b.pk)
from
b left join a on a.prod_id = b.prod_id
group by
b.prod_id
having
count(distinct b.pk) > count(distinct a.pk)
选择t2.prod\u id
按产品id t1从组中选择count*amount,A.prod\u id,
从B组中按产品id t2选择计数*金额、B产品id
其中t1.prod_id=t2.prod_id
t2.amount>t1.amount
Oracle 11g R2架构设置:
问题1:
这个查询不缺少FROM子句吗?也许你可以解释一下你在做什么,这样人们可以从中学习。错误的查询。缺少第条我认为如果考虑到tableA对于给定的产品id可能根本没有行的可能性,这将更加准确。@GordonLinoff。谢谢你的建议。我添加了一个查询来考虑这一点。
| PROD_ID |
|---------|
| 333 |
| 111 |