Несколько Где Ins в поисковом запросе? - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть три таблицы в БД доступа.

Labs (ID, TestLab)
Standards (ID, Standard, Keywords)
LabStd (ID, LabID, StdID)

В лаборатории много стандартов.До сегодняшнего дня все, что мне нужно было сделать, это сопоставить поисковую фразу с ключевым словом или стандартными столбцами в таблице Standards.

Select Labs.ID, Labs.TestLab, Standards.standard
FROM Standards INNER JOIN (Labs INNER JOIN LabStd 
    ON Labs.ID = LabStd.LabID)
  ON Standards.ID = LabStd.StdID 
WHERE Standards.Keywords LIKE "%labstandard%"
OR Standards.standard LIKE "%labstandard%"
ORDER BY Labs.id, Standards.ID

Теперь, если в поиске используется знак плюс (labstandard1 + labstandard2) Мне нужно разбить строку и посмотреть, соответствует ли лаборатория всем стандартам поиска.Я считаю, что мне нужно использовать подзапрос для этого и пытался использовать несколько операторов WHERE IN, но это не работает, поэтому я в растерянности.

В качестве теста я удалил операторы LIKE ипросто пошел на равных.Следующий запрос не возвращает результатов, даже если для каждого из них существует соответствующий стандарт и лаборатория, связанная с обоими стандартами.

SELECT Labs.ID, Labs.TestLab, Standards.standard
FROM Standards INNER JOIN (Labs INNER JOIN LabStd 
    ON Labs.ID = LabStd.LabID) 
ON Standards.ID = LabStd.StdID 
WHERE LabStd.StdID IN 
    (SELECT ID AS StdID FROM Standards 
     WHERE (Standards.Keywords = 'labstandard1' 
     OR Standards.standard ='labstandard1')
    ) 
AND LabStd.StdID IN 
    (SELECT ID as StdID 
     FROM Standards
     WHERE (Standards.Keywords = 'labstandard2'
            OR Standards.standard ='labstandard2')
    ) 
ORDER BY Labs.id, Standards.ID

Надеюсь, я достаточно ясно объяснил, дайте мне знать, если мне нужно что-то уточнить.

Ответы [ 4 ]

1 голос
/ 22 февраля 2012

Проблема с вашим последним запросом заключается в том, что вы ищете одну строку LabStd, где StdId находится в обоих подмножествах, а это невозможно. Вам нужно найти все лаборатории, для которых существуют оба стандарта. Что-то вроде этого:

SELECT 
    *
FROM
    Labs
WHERE
    EXISTS (
        SELECT
            1
        FROM
            LabStd INNER JOIN Standards ON LabStd.StdId = Standards.Id
        WHERE
            LabStd.LabId = Labs.Id
            AND
            ( Standards.Standard = 'labstandard1' or Standards.Keywords = 'labstandard1' )
    )
    AND
    EXISTS (
        SELECT
            1
        FROM
            LabStd INNER JOIN Standards ON LabStd.StdId = Standards.Id
        WHERE
            LabStd.LabId = Labs.Id
            AND
            ( Standards.Standard = 'labstandard2' or Standards.Keywords = 'labstandard2' )
    )
1 голос
/ 22 февраля 2012

Примерно так может быть, подумал standard.keywords предполагает, что это должно быть примерно так ...

Select ID as StdID From Standards Where 
Standards.Keywords ='labstandard1' 
OR 
Standards.standard = "labstandard1"
OR
Standards.Keywords ='labstandard2' 
OR 
Standards.standard = "labstandard2"

Затем используйте All, чтобы получить labstds

select LabStd.LabID 
Where StdId = all (Select ID as StdID From Standards Where 
Standards.Keywords ='labstandard1' 
OR 
Standards.standard = "labstandard1"
OR
Standards.Keywords ='labstandard2' 
OR 
Standards.standard = "labstandard2")

Затем присоединитесьназад в лабораторию.

Такие запросы могут привести вас к сумасшествию.Всегда разбивайте их от внутренней к внешней и проверяйте детали.

0 голосов
/ 23 февраля 2012

Альтернативой является использование производной таблицы для подсчета количества соответствующих стандартов. Затем используйте предложение HAVING, чтобы обеспечить правильное количество совпадений.

Примечание: count(*) = 2 - это число уникальных условий поиска

SELECT  Labs.ID, Labs.TestLab, Standards.Standard
FROM  (  
          ( Labs INNER JOIN LabStd  ON Labs.ID = LabStd.LabID )
                 INNER JOIN Standards ON Standards.ID = LabStd.StdID )
                 INNER JOIN (
                        SELECT   ls.LabID, COUNT(*) AS NumMatched
                        FROM     Standards s INNER JOIN LabStd ls ON s.ID = ls.StdID
                        WHERE  ( s.standard LIKE "%AAMA 505%" OR s.Keywords LIKE "%AAMA 505%")
                        OR     ( s.standard LIKE "%AAMA 614%" OR s.Keywords LIKE "%AAMA 614%" )
                        GROUP BY ls.LabID
                        HAVING COUNT(*) = 2 
                  )  matched ON matched.LabID = Labs.ID
0 голосов
/ 22 февраля 2012

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

**Standards**
ID      Standard        Keywords    
20      AAMA 505        Dry Shrinkage Thermal Cycling   
26      AAMA 614        High Perf. Organic Coatings on Plastic

**Labs**
ID      TestLab
10      TESTING, INC
21      LABORATORIES, INC.
3       FRESNO TESTING, INC.

**LabStd**
ID      LabID       StdID
283     3           20
284     10          20
285     21          20
291     21          26
299     10          26

Вот запрос, который работает.Это вытаскивает вытягивает лабораторные идентификаторы 10 и 21 и оставляет 3, что является правильным.

SELECT Labs.ID, Labs.TestLab, Standards.standard
FROM Standards INNER JOIN (Labs INNER JOIN LabStd 
    ON Labs.ID = LabStd.LabID) 
ON Standards.ID = LabStd.StdID 
WHERE LabStd.StdID IN 
    (
        SELECT labs.testlab 
        FROM Standards INNER JOIN 
            (Labs INNER JOIN LabStd ON Labs.ID = LabStd.LabID) 
        ON Standards.ID = LabStd.StdID 
        WHERE standards.standard = "AAMA 505"
    ) 
AND Labs.TestLab IN 
    (
        SELECT labs.testlab 
        FROM Standards INNER JOIN 
            (Labs INNER JOIN LabStd ON Labs.ID = LabStd.LabID) 
        ON Standards.ID = LabStd.StdID 
        WHERE standards.standard = "AAMA 614"
    ) 
ORDER BY Labs.id, Standards.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...