SQL - запрос на сопоставление строк в текущем месяце со всеми предыдущими данными - PullRequest
0 голосов
/ 30 августа 2018

У меня есть база данных сертификатов SSL, которая обновляется один раз в месяц. Я хочу выполнить SQL-запрос для получения всех записей в моей базе данных только с августа , когда дата окончания срока действия сертификата и компания, купившая сертификат, соответствуют предыдущему месяцу.

Для простоты представьте, что схема базы данных выглядит следующим образом:

Subject Organisation | Issued Date | Expiry Date | Issuing Company | Month | Year

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

SELECT * 
FROM AugustTable 
WHERE 
"Subject Organisation" = (SELECT 
                          "Subject Organisation" 
                          FROM AllCertsTable 
                          WHERE ("Month" != 'August' AND "Year" != '2018')
                         ) 
AND 
"Expiry" = (SELECT 
            "Expiry" 
            FROM AllCertsTable 
            WHERE ("Month" != 'August' AND "Year" != '2018')
           )

Работает следующий вид запроса, но мне нужны только данные за август или август + все остальные данные, добавленные снизу вместо объединения столбцов из каждого отношения.

SELECT * 
FROM AllCertsTable AS A 
INNER JOIN August AS B 
ON (A."Subject Organisation" = B."Subject Organisation" 
    AND 
    A."Valid To" = B."Valid To" 
    AND 
    A."Issuing Company" = 'XYZ'
   )

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы, кажется, хотите что-то вроде этого:

SELECT a.* 
FROM AllCertsTable a 
WHERE a."Month" = 'August' AND a."Year" = 2018 AND
      (a."Subject Organisation", a."Expiry") IN
         (SELECT "Subject Organisation", "Expiry"
          FROM AllCertsTable act
          WHERE act."Month" <> 'August' OR act."Year" <> '2018'
         ) ;

Нет никакой причины создавать временную таблицу только для записей за август.

0 голосов
/ 30 августа 2018

Как насчет

SELECT
  *
FROM AllCertsTable AS Aug
WHERE 1 = 1
 AND Aug."Month" = 'August'
 AND EXISTS (
   SELECT 1 FROM AllCertsTable AS Temp
   WHERE 1 = 1
    AND Temp."Subject Organisation" = Aug."Subject Organisation"
    AND ((Temp."Year" = Aug."Year" AND EXTRACT(MONTH, to_date(Temp."Month", 'Month')) < EXTRACT(MONTH, to_date(Aug."Month", 'Month'))) OR 
         (Temp."Year" < Aug."Year"))
 )

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

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