SQL находит совпадения в одном столбце

#sql #oracle-sqldeveloper

#sql #oracle-sqldeveloper

Вопрос:

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

Укажите номер детали, описание детали и класс изделия для каждой пары деталей, входящих в один и тот же класс изделия. (Например, одна такая пара будет частью AT94 и частью FD21, потому что класс элемента для обеих частей — HW .)

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

Ответ №1:

Я собираюсь дать вам часть ответа:

Вам нужны пары. Таким образом, вы будете по существу группировать элементы, имеющие количество 2.

Удачи!


Добавление:

Не забудьте использовать функции агрегирования для всех элементов после ВЫБОРА, которые не находятся в GROUP BY. В зависимости от используемого вами компонента database engine существуют функции конкатенации, которые могут быть полезны.

Комментарии:

1. Не требуется. Пары элементов — это просто элементы, в которых элементы 1 и 2 имеют одинаковое значение в столбце.

2. Конечно, всегда есть несколько способов получить то, что вы хотите. OP может ОБЪЕДИНИТЬ таблицу с самим собой и получить что-то из этого. Не идеально.

3. Согласен, но самосоединение будет необходимо, если он хочет, чтобы значения из обоих элементов были в одной результирующей записи.

4. @drdwilcox Не обязательно. Агрегированные функции Contatenation позволили бы ему группировать элементы по записи.

5. -1 Это неправильно. Это даже не так. Это просто вводящий в заблуждение мумбо-юмбо.

Ответ №2:

Обычно учитель, ассистент выпускника или самый умный ученик в классе лучше способен интерпретировать намерения учителя. Однако вам не нужно ГРУППИРОВАТЬСЯ, чтобы решить эту проблему.

Ответ №3:

ВЫБЕРИТЕ part_nr, part_desc, item_class ИЗ заказа деталей ПО item_class

Ответ №4:

Вы ищете Group By. Поскольку это домашнее задание, я не собираюсь приводить конкретный пример, но синтаксис, как правило,

 SELECT [COLUMNS]
FROM [TABLE]
WHERE [PREDICATE] --Okay, all that's normal in SQL
GROUP BY [COLUMN] --This column should be a named column in your SELECT statement.
  

Обновление: как говорит MPelletier, вы также хотите «ИМЕТЬ»

Удачной охоты.

Ответ №5:

 SELECT F.ITEM_NUM, S.ITEM_NUM, F.DESCRIPTION, S.DESCRIPTION, F.CATEGORY, S.CATEGORY
FROM ITEM F, ITEM S
WHERE F.CATEGORY = S.CATEGORY
AND F.ITEM_NUM < S.ITEM_NUM
ORDER BY F.ITEM_NUM, S.ITEM_NUM;`
  

Ответ №6:

Вы должны объединить таблицу с самой собой.

Что-то подобное может направить вас на правильный путь:

 select <list of fields> 
from parts p1
inner join parts p2 on p1.item_class = p2.item_class
where p1.part_number < p2.part_number
  

В результате этого утверждения есть несколько предостережений.

Например:

Вы получите дубликаты в форме (a, b) и (b, a)

Вы также получите каждый элемент, объединенный с самим собой (a, a).

Редактировать:

Исправлены оговорки (путем добавления предложения where).

Комментарии:

1. Это неудобный подход, потому что объединение создаст 4 элемента: item1-item1, item1-item2, item2-item1 и item2-item2. Затем вам нужно отфильтровать все это дерьмо.

2. Я предполагаю, что срок выполнения задания уже прошел, поэтому я добавил «неудобный» фильтр, чтобы избавиться от «всего этого дерьма». Я сомневаюсь, что какое-либо решение, использующее GROUP BY and HAVING , проще, чем это.