Как сформулировать SQL-запрос с условием WHERE и более чем x записями? - PullRequest
0 голосов
/ 18 апреля 2019

Я автоматически строю SQL-запрос с использованием макроса VBA после пользовательского ввода. Запрос выглядит примерно так:

Select Distinct MATERIAL 
From MyTABLE 
Where (COND11) OR (COND12) OR COND13) OR (COND14) 
OR (COND21) OR (COND22) OR (COND23)

Это дает мне все материалы, которые имеют тип кривой i. Условия CONDij являются условиями для типа кривой i. Это работает до здесь. У меня есть один тип кривой, где иногда только 1 точка на условие находится в базе данных. (В моем случае модуль Юнга против температуры, если в базе данных есть только комнатная температура, никакая кривая не может быть построена).

Теперь к вопросу. Как бы я сформулировал запрос, который выдает все материалы по крайней мере с двумя точками за условие. Черновик может выглядеть так:

Select Distinct MATERIAL 
From MyTABLE 
Where (COND11 AND (Select count(*) from MyTable Where COND11)>1) OR ... (same for other ij=

Я не получаю ошибку, она просто "не работает", что означает, что я все еще получаю кривые только с 1 точкой.

РЕДАКТИРОВАТЬ: У меня есть подозрение, что подзапрос: Select count(*) from MyTable Where COND11)>1 не ограничивается поиском Distinct Material, который я ищу. Таким образом, запрос ищет отдельные материалы, но подзапрос подсчитывает количество записей любого материала, которые удовлетворяют условиям. Как бы я ограничил материал в подзапросе?

Вот полный вывод запроса в качестве примера. (Предупреждаю, это беспорядок)

Запрос

Select
  Distinct ArticleIDEMS,
  CompanyCDProd,
  ArticleShort
From
  V_Pruefungen
Where
  (
    (
      (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '5'
        AND ZUSTAND = 'conditioned'
      )
      AND (
        Select
          Count(*)
        From
          V_Pruefungen
        Where
          (
            PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
            AND EINZELWERT = 'E-Modulus  [MPa]'
            AND BS_BEZEICHNUNG1 = '5'
            AND ZUSTAND = 'conditioned'
          )
      ) > 2
    )
    OR (
      (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '50'
        AND ZUSTAND = 'conditioned'
      )
      AND (
        Select
          Count(*)
        From
          V_Pruefungen
        Where
          (
            PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
            AND EINZELWERT = 'E-Modulus  [MPa]'
            AND BS_BEZEICHNUNG1 = '50'
            AND ZUSTAND = 'conditioned'
          )
      ) > 2
    )
    OR (
      (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '5'
        AND ZUSTAND = 'dry'
      )
      AND (
        Select
          Count(*)
        From
          V_Pruefungen
        Where
          (
            PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
            AND EINZELWERT = 'E-Modulus  [MPa]'
            AND BS_BEZEICHNUNG1 = '5'
            AND ZUSTAND = 'dry'
          )
      ) > 2
    )
    OR (
      (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '50'
        AND ZUSTAND = 'dry'
      )
      AND (
        Select
          Count(*)
        From
          V_Pruefungen
        Where
          (
            PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
            AND EINZELWERT = 'E-Modulus  [MPa]'
            AND BS_BEZEICHNUNG1 = '50'
            AND ZUSTAND = 'dry'
          )
      ) > 2
    )
  )

EDIT:

Пример результата:

Перечисленные здесь материалы - это те, которые "имеют кривую" . Наличие кривой означает, что существует более 2 точек данных, которые заполняют один из нескольких наборов условий. Например, испытание на растяжение можно проводить при 5 мм / мин или при 50 мм / мин с сухим или кондиционированным состоянием образца. Это означает, что есть 4 возможных набора условий, которые позволяют кривой быть кривой растяжения. Теперь, если в одном из этих наборов условий более 2 точек, это кривая. Я знаю условия кривой, но я не знаю, как ограничить их двумя или более точками. Это вызывает проблемы для модуля упругости (E-Модуль) против кривой температуры. Если в базе данных есть свойство при 23 ° C, но ничего другого, кривая не может быть построена. Поскольку это относится к некоторым материалам, их следует исключить из запроса.

Я надеюсь, что эта разработка немного прояснила вопрос.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Существует несколько способов перекодировать ваш запрос во что-то более изящное, и с тем, что вы показали, трудно сказать, какое решение будет наиболее эффективным.

Вот уже первая попытка

SELECT V.ArticleIDEMS, V.CompanyCDProd, V.ArticleShort
FROM V_Pruefungen V
INNER JOIN
(
    Select
        ArticleIDEMS,
        SUM(CASE WHEN BS_BEZEICHNUNG1 = '5'  AND ZUSTAND = 'conditioned' THEN 1 ELSE 0 END) AS cnt_cond_5, 
        SUM(CASE WHEN BS_BEZEICHNUNG1 = '50' AND ZUSTAND = 'conditioned' THEN 1 ELSE 0 END) AS cnt_cond_50,
        SUM(CASE WHEN BS_BEZEICHNUNG1 = '5'  AND ZUSTAND = 'dry' THEN 1 ELSE 0 END) AS cnt_dry_5, 
        SUM(CASE WHEN BS_BEZEICHNUNG1 = '50' AND ZUSTAND = 'dry' THEN 1 ELSE 0 END) AS cnt_dry_50
    From
      V_Pruefungen
    WHERE
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'  
    GROUP BY ArticleIDEMS   
) C ON V.ArticleIDEMS=C.ArticleIDEMS     
WHERE C.cnt_cond_5 > 2
  AND C.cnt_cond_50 > 2
  AND C.cnt_dry_5 > 2
  AND C.cnt_dry_50 > 2

Попробуйте и оставьте отзыв

Примечание. Я предположил, что ArticleIDEMS - это уникальный идентификатор записей ваших статей. Если это не так, вероятно, он не будет работать так, как ожидалось.

0 голосов
/ 26 апреля 2019

Этот запрос был предоставлен моим коллегой, и, похоже, он работает нормально, поэтому проблема решена.

select
  distinct articleidems,
  companycdprod,
  articleshort
from
  (
    select
      articleidems,
      companycdprod,
      articleshort,
      pruefbedingungen,
      einzelwert,
      bs_bezeichnung1
      zustand
    from
      v_pruefungen
    where(
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '5'
        AND ZUSTAND = 'conditioned'
      )
      OR (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '50'
        AND ZUSTAND = 'conditioned'
      )
      OR (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '5'
        AND ZUSTAND = 'dry'
      )
      OR (
        PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
        AND EINZELWERT = 'E-Modulus  [MPa]'
        AND BS_BEZEICHNUNG1 = '50'
        AND ZUSTAND = 'dry'
      )
    group by
      articleidems,
      companycdprod,
      articleshort,
      pruefbedingungen,
      einzelwert,
      bs_bezeichnung1
      zustand
    having
      count (*) > 1
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...