Как вытащить строку только один раз из MS Query - PullRequest
0 голосов
/ 25 февраля 2020

Итак, у меня есть таблицы «Sample», «Test» и «Result», связанные друг с другом из базы данных, и я пытаюсь получить информацию с помощью MS Query. Каждый образец имеет один тест, и каждый тест может содержать около 20 результатов, введенных разными людьми.

Я хочу, чтобы образец отображался только в том случае, если введенное мной имя человека НЕ ​​связано с вводом ЛЮБОГО из результатов.

SELECT SAMPLE.SAMPLE_NUMBER, SAMPLE.TEXT_ID, SAMPLE.STATUS, SAMPLE.DATE_COMPLETED, SAMPLE.LOCATION, TEST.ANALYSIS, RESULT.ENTERED_BY

FROM DATABASE.RESULT RESULT, DATABASE.SAMPLE SAMPLE, DATABASE.TEST TEST

WHERE TEST.SAMPLE_NUMBER = SAMPLE.SAMPLE_NUMBER AND RESULT.TEST_NUMBER = TEST.TEST_NUMBER 
        AND ((TEST.ANALYSIS='ID_META' Or TEST.ANALYSIS='ID_RIBO' Or TEST.ANALYSIS='ID_BACTERIA' Or TEST.ANALYSIS='ID_MOULD') 
        AND (SAMPLE.STATUS='C') AND (SAMPLE.DATE_COMPLETED Is Not Null) 
        AND (RESULT.ENTERED_ON Between [Start Date] And [End Date]) 
        AND (RESULT.ENTERED_BY<>[Enter Name]))
ORDER BY SAMPLE.DATE_COMPLETED

Это код, который у меня есть до сих пор. но проблема в том, что если Алан ввел один из 10 результатов, то тот же самый образец будет отображаться 9 раз и просто не будет отображаться в течение одного раза, когда он не вводил результат. Есть ли способ, которым я могу сказать, если он вообще вводил ЛЮБОЙ результат, тогда образец вообще не появится.

Правка - чтобы включить в запрос дополнительные предложения. Запрос извлекается непосредственно из окна подключения Excel (из MS Query).

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Это отвечает оригинальной версии вопроса.

Вы, похоже, описываете NOT EXISTS:

SELECT s.SAMPLE_NUMBER
FROM DATABASE.SAMPLE s
WHERE NOT EXISTS (SELECT 1
                  FROM DATABASE.RESULT r JOIN
                       DATABASE.TEST t
                       ON r.TEST_NUMBER = t.TEST_NUMBER
                  WHERE t.SAMPLE_NUMBER = s.SAMPLE_NUMBER AND 
                        R.ENTERED_ON >= DATE '2020-02-01' AND
                        R.ENTERED_ON >= DATE '2020-02-03' AND
                        R.ENTERED_BY = 'ALAN'
                 ) AND  
      S..DATE_COMPLETED Is Not Null ;

Я оставил в ваших дополнительных условиях, даже если они не упомянуты в вопросе.

Примечания:

  • НИКОГДА не используйте запятые в предложении FROM.
  • Всегда используйте правильный, явный, стандартный , читаемый синтаксис JOIN.
  • Используйте правильные DATE константы в Oracle.
  • Не используйте BETWEEN с DATE особенно в Oracle. Тип данных DATE имеет компонент времени, который может не отображаться при просмотре данных.
0 голосов
/ 25 февраля 2020

Пожалуйста, попробуйте следующий запрос:

SELECT DISTINCT(SAMPLE.SAMPLE_NUMBER) as SAMPLE_NUMBER 
FROM DATABASE.SAMPLE SAMPLE
LEFT OUTER JOIN DATABASE.TEST TEST ON TEST.SAMPLE_NUMBER = SAMPLE.SAMPLE_NUMBER 
LEFT OUTER JOIN DATABASE.RESULT RESULT ON RESULT.TEST_NUMBER = TEST.TEST_NUMBER
WHERE ((SAMPLE.DATE_COMPLETED Is Not Null) 
AND (RESULT.ENTERED_ON Between CAST('01-FEB-2020' as DATE) And CAST('02-FEB-2020' as DATE))
AND (RESULT.ENTERED_BY <> 'ALAN'))
...