Как получить одно общее значение из базы данных с помощью ОБЪЕДИНЕНИЯ

#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)))
  

Этот запрос решил мою проблему……….