#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
andHAVING
, проще, чем это.