Если и только если условие SQL - SQL server 2008 - PullRequest
1 голос
/ 04 января 2011

Я пишу SQL-оператор для выбора пользователя в таблице, если этого пользователя нет в другой таблице, затем я хочу извлечь все его данные из другой таблицы, а затем я выведу все это в Coldfusion.

Как мне это сделать? Я пытался, моя попытка ниже:

pro_profile == Все сотрудники mod_userStatus == Все сотрудники категории специалистов Я делаю не существует, чтобы удалить профессиональные вещи, чтобы просто получить наш студенческий персонал. mod_StudentCertifications - это список сертификатов, которые они (студенты) имеют.

Если мы делаем оператор AND между операторами where, он не возвращает ни одного пользователя, или только тех пользователей, которые удовлетворяют обоим условиям, если мы делаем OR, он возвращает пользователей только с одним условием. Мне нужно сначала сопоставить несуществующее, затем перейти к утверждению о существовании.

Это можно?

Вот мое заявление:

SELECT profileID, firstName, lastName
FROM pro_Profile
WHERE not exists (
         SELECT profileID
         FROM mod_userStatus
         WHERE mod_userStatus.profileID = pro_Profile.profileID
        )             
        OR            
        exists (
          SELECT          
            cprAdultExp,
            cprInfantChildExp,
            cprFPRExp,
            aedExp,
            firstAidExp,
            emtExp,
            waterSafetyInstructionExp,
            bloodPathogensExp,
            oxygenAdminExp,
            lifegaurdingExp,
            wildernessResponderExp,
            notes
         FROM mod_StudentCertifications
         WHERE mod_StudentCertifications.profileID = pro_Profile.profileID       

        );

Ответы [ 3 ]

2 голосов
/ 04 января 2011

Для «полного» вытягивания:

SELECT p.profileID, p.firstName, p.lastName, sc.cprAdultExp, sc.....
FROM pro_Profile AS p
   LEFT OUTER JOIN mod_StudentCertifications AS sc ON sc.profileID = p.profileID
WHERE p.profileID NOT IN
    (
       SELECT profileID
       FROM mod_userStatus
    )
;

Для одного «профильного» вытягивания:

SELECT p.profileID, p.firstName, p.lastName, sc.cprAdultExp, sc.....
FROM pro_Profile AS p
   LEFT OUTER JOIN mod_StudentCertifications AS sc ON sc.profileID = p.profileID
WHERE p.profileID = ?
    AND p.profileID NOT IN      
    (
       SELECT profileID
       FROM mod_userStatus
       WHERE profileID = ?
    )
;

РЕДАКТИРОВАТЬ: Посмотрите на план выполнения с использованием LEFT OUTER JOIN дляmod_userStatus и проверка его первичного ключа для нулевого VS оператора NOT IN в аналогичной установке.Оператор NOT IN действительно дешевле.

LEFT OUTER JOIN выполняет фильтрацию и сопоставление хэшей (Стоимость: 2.984): alt text

Пока NOT IN выполняет объединение слиянием (Стоимость: 1.508): alt text

1 голос
/ 04 января 2011

Я не совсем уверен, что понимаю ваш вопрос.Но я думаю вы пытаетесь это сделать:

SELECT PROF.profileID, 
       PROF.firstName, 
       PROF.lastName
       CERT.cprAdultExp,
       CERT.cprInfantChildExp,
       CERT.cprFPRExp,
       CERT.aedExp,
       CERT.firstAidExp,
       CERT.emtExp,
       CERT.waterSafetyInstructionExp,
       CERT.bloodPathogensExp,
       CERT.oxygenAdminExp,
       CERT.lifegaurdingExp,
       CERT.wildernessResponderExp,
       CERT.notes
  FROM pro_Profile AS PROF INNER JOIN mod_StudentCertifications AS CERT
      ON PROF.profileID = CERT.profileID
   WHERE NOT EXISTS (SELECT profileID FROM mod_userStatus 
         WHERE mod_userStatus.profileID = pro_Profile.profileID) 

Это извлекает информацию из pro_Profile и mod_StudentCertifications только для тех людей, чей профиль отсутствует в mod_userStatus.

Вы также можете упростить предложение WHERE следующим образом:

WHERE PROF.profileID NOT IN (SELECT profileID FROM mod_UserStatus)

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

0 голосов
/ 04 января 2011

Я закончил делать левое соединение, так как таблица (Pro_Profile) является основной, и она работала!

            SELECT
            pro_Profile.profileID,
            pro_Profile.firstName,
            pro_Profile.lastName,
            mod_StudentCertifications.cprAdultExp,
            mod_StudentCertifications.cprInfantChildExp,
            mod_StudentCertifications.cprFPRExp,
            mod_StudentCertifications.aedExp,
            mod_StudentCertifications.firstAidExp,
            mod_StudentCertifications.emtExp,
            mod_StudentCertifications.waterSafetyInstructionExp,
            mod_StudentCertifications.bloodPathogensExp,
            mod_StudentCertifications.oxygenAdminExp,
            mod_StudentCertifications.lifegaurdingExp,
            mod_StudentCertifications.wildernessResponderExp,
            mod_StudentCertifications.notes
        FROM 
            pro_Profile
        LEFT JOIN mod_StudentCertifications
        ON
            mod_StudentCertifications.profileID = pro_Profile.profileID   
        WHERE not exists (
            SELECT 
                profileID
            FROM 
                mod_userStatus
            WHERE
                  mod_userStatus.profileID = pro_Profile.profileID
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...