#sql #unions
#sql #объединения
Вопрос:
2 записи на приведенном выше изображении взяты из базы данных, в приведенной выше таблице ограничения (SID и LINE_ITEM_ID), SID и LINE_ITEM_ID оба столбца используются для поиска уникальной записи.
Мои проблемы: Я ищу запрос, он должен извлекать записанное из базы данных в зависимости от условий, если я ищу PART_NUMBER = ‘PAU43-IMB-P6’ 1. он должен извлекать одну запись из базы данных, если я ищу PART_NUMBER = ‘PAU43-IMB-P6’, независимо от того, к какому SID принадлежит этот элемент, если есть только один записанный либо под SID = 1, либо SID = 2. 2. он должен извлекать одну запись, которая находится под SID = только 2, из базы данных при поиске PART_NUMBER = ‘PAU43-IMB-P6’, если есть 2 элемента, один в SID = 1, а другой в SID = 2.
я ищу запрос, который будет выполнять поиск по заданному part_number в зависимости как от SID 1, так и от 2, и он должен возвращать значение под SID = 2, и он может возвращать значение под SID = 1, только если под SID = 2 нет записей (запрос должен выдерживать нагрузку в миллион записей поиска).
Спасибо
Комментарии:
1. поскольку мне нужно получить 1 запись из 2 или 3, ОБЪЕДИНЕНИЕ работает только тогда, когда значения всех извлекаемых столбцов одинаковы .. но если одно из значений столбца отличается, оно будет рассматривать эту запись как другую, даже если остальные значения столбца похожи….
Ответ №1:
Select *
from Table
where SID||LINE_ITEM_ID = (
select Max(SID)||Max(LINE_ITEM_ID)
from table
where PART_NUMBER = 'PAU43-IMB-P6'
);
Ответ №2:
Если я правильно понимаю, для каждого рассмотренного LINE_ITEM_ID
вы хотите вернуть только то, для которого значение больше SID
. Это общее требование и, как и большинство вещей в SQL, может быть записано многими различными способами; наилучшая производительность будет зависеть от многих факторов, не последним из которых является используемый вами продукт SQL.
Вот один из возможных подходов:
SELECT DISTINCT * -- use a column list
FROM YourTable AS T1
INNER JOIN (
SELECT T2.LINE_ITEM_ID,
MAX(T2.SID) AS max_SID
FROM YourTable AS T2
GROUP
BY T2.LINE_ITEM_ID
) AS DT1 (LINE_ITEM_ID, max_SID)
ON T1.LINE_ITEM_ID = DT1.LINE_ITEM_ID
AND T1.SID = DT1.max_SID;
Тем не менее, я не припомню, чтобы видел такое, которое полагалось бы на UNION
реляционный оператор. Вы могли бы легко переписать вышесказанное, используя INTERSECT
оператор отношения, но это было бы более подробным.
Ответ №3:
Ну, в моем случае это сработало примерно так:
select LINE_ITEM_ID,SID,price_1,part_number from (
(select LINE_ITEM_ID,SID,price_1,part_number from Table where SID = 2)
UNION
(select LINE_ITEM_ID,SID,price_1,part_number from Table SID = 1 and line_item_id NOT IN (select LINE_ITEM_ID,SID,price_1,part_number from Table SID = 2)))
Этот запрос решил мою проблему……….