2011-01-03 2 views
1

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

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

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

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

Это что, возможно?

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

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  

     ); 
+0

Исходя из использования И (а не ИЛИ) - у вас нет данных, которые соответствуют. Вам нужно создать его или просмотреть свои критерии. –

ответ

2

Для "полного" тянуть:

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 = ? 
    ) 
; 

EDIT: Посмотрел на выполнение план использования LEFT OUTER JOIN для mod_userStatus и проверки его первичного ключа для нулевого VS. инструкция NOT IN в аналогичной настройке. Заявление NOT IN действительно менее дорогостоящее.

ЛЕВАЯ OUTER JOIN выполняет фильтр & хэш-матча (Стоимость: 2,984): alt text

Пока НЕ ​​выполняет слияние (Стоимость: 1.508): alt text

+0

'IN' не поддерживает более одного столбца для сравнения, что может не работать для части' EXISTS'.Но предложение SELECT EXISTS не оценивается в любом случае ... –

+0

@OMG Ponies Отредактировано после того, как я увидел, что было после OP. Благодаря! –

+0

Вы имеете в виду, что вы скопировали ответ OPs, указав, что все работает, используя LEFT JOIN. –

0

я ликвидируется делать левое соединение, так как таблица (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 
     ); 
+0

Вы можете упростить это предложение WHERE, см. Мой ответ в другом месте этого вопроса. –

1

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

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 PROF.profileID NOT IN (SELECT profileID FROM mod_UserStatus) 

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

+0

Хорошо, я думаю, я понял, что вы пытаетесь сделать, глядя на сходство моего ответа и то, что вы заработали, используя себя. –

Смежные вопросы