SQL选择所有行具有相同的值

时间:2019-11-07 16:12:18

标签: sql oracle

我想显示产品表中所有具有相同产品编号的行。我尝试了这段代码,但出现了错误

  
      
  1. 00000-“列定义不明确”
  2.   
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               ........
....            .......           ....               ........

4 个答案:

答案 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