我想显示产品表中所有具有相同产品编号的行。我尝试了这段代码,但出现了错误
- 00000-“列定义不明确”
WITH cte AS(
SELECT product_no
FROM product
GROUP BY product_no
HAVING COUNT(*) > 1)
select * from product v
inner join cte on cte.product_no = v.product_no
where
ACCOUNTING_GROUP not in ('1000','1200')
我想要的结果:
Product_no produc_Descrip ACCOUNTING_GROUP acc_group_descr
123 bike 1001 semi-finish-A
123 bike 1002 semi-finish-B
1234 motor 1005 ........
1234 motor 1006 ........
.... ....... .... ........
答案 0 :(得分:0)
我不确定我的答案,因为缺少一些信息,我们不知道表产品的结构,但是我看到的是您正在加入“ cte.PART_NO”,并且未定义此字段或在您的with子句“ SELECT product_no”中选择。
您可以尝试
SELECT PART_NO, COUNT(1) FROM product
GROUP BY PART_NO
HAVING COUNT(1) > 1)
但是为了提供更好的答案,我们需要表的结构以及一些插入的数据示例和预期结果。目前,您选择“ *”并预期会有2列结果,这似乎也很含糊。
当前,您的查询选择了不在表1000或1200中的所有产品,它们在表产品中出现了2次或多次,这是您真正要查找的产品吗?
答案 1 :(得分:0)
对于您要完成的工作,我可能会稍微更改查询
with CTE as (SELECT PRODUCT_NO
FROM PRODUCT
GROUP BY PRODUCT_NO
HAVING COUNT(*) >1)
SELECT PRODUCT_NO, produc_descrip, ACCOUNTING_GROUP, acc_group_descr
FROM PRODUCT V
WHERE PRODUCT_NO IN(SELECT PRODUCT_NO FROM CTE)
AND ACCOUNT_GROUP NOT IN('1000','1200');
虽然说实话,我认为您不需要在这里使用with语句,但您可以只使用嵌套查询来完成相同的事情。
答案 2 :(得分:0)
假设您有一个诸如accounting_group
之类的唯一列,我将只使用exists
:
select p.*
from products p
where exists (select 1
from products p2
where p2.product_no = p.product_no and
p2.accounting_group <> p.accounting_group
)
order by p.product_no;
如果不是这种情况,请使用窗口功能:
select p.*
from (select p.*, count(*) over (partition by product_no) as cnt
from product p
) p
where cnt >= 2
order by product_no;
答案 3 :(得分:0)
这是一个优化的版本,您可以尝试。
SELECT * FROM PRODUCTS P
JOIN (SELECT PRODUCT_NO FROM PRODUCTS WHERE ACCOUNTING_GROUP NOT IN ('1000','1200') GROUP BY PRODUCT_NO HAVING COUNT(*) > 1 )TEMP
ON P.PRODUCT_NO = TEMP.PRODUCT_NO