SQL выбрать все строки имеют одинаковое значение - PullRequest
0 голосов
/ 07 ноября 2019

Я бы хотел показать все строки, которые имеют одинаковый продукт, из таблицы продуктов. Я пытаюсь этот код, но я получил ошибку

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               ........
....            .......           ....               ........

Ответы [ 4 ]

0 голосов
/ 07 ноября 2019

Вот оптимизированная версия, вы можете попробовать.

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
0 голосов
/ 07 ноября 2019

за то, что вы пытаетесь выполнить, я бы, вероятно, немного изменил запрос,

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, вы могли быпросто использовал вложенный запрос, чтобы выполнить то же самое.

0 голосов
/ 07 ноября 2019

Если у вас есть уникальный столбец, такой как 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;
0 голосов
/ 07 ноября 2019

Я не уверен в своем ответе, потому что некоторая информация отсутствует, мы не знаем структуру табличного продукта, но я вижу, что вы присоединяетесь к "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 или более раз встоловый продукт, это то, что вы действительно ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...