SQL должен возвращать данные, даже если конкретный оператор не соответствует - PullRequest
0 голосов
/ 26 сентября 2011

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

Пожалуйста, помогите!

Код: (обратите внимание, где используется переменная Coldfusion, так что ничего необычного)

    SELECT     
        dbo.mod_employmentAppQuestionAnswers.questionID 
        ,dbo.mod_employmentAppQuestionAnswers.questionDefinitionID 
        ,dbo.mod_employmentAppQuestionAnswers.AppID 
        ,dbo.mod_employmentAppQuestionAnswers.questionText 
        ,dbo.mod_employmentAppQuestionAnswers.questionDate1 
        ,dbo.mod_employmentAppQuestionAnswers.questionDate2 
        ,dbo.mod_employmentAppQuestionAnswers.questionBit 
        ,dbo.mod_employmentAppQuestionDefinitions.definitionID 
        ,dbo.mod_employmentAppQuestionDefinitions.jobTitleID 
        ,dbo.mod_employmentAppQuestionDefinitions.title AS QuestionTitle 
        ,dbo.mod_employmentAppQuestionDefinitions.questionTypeID 
        ,dbo.mod_employmentAppQuestionDefinitions.description 
        ,dbo.mod_employmentAppQuestionDefinitions.isActive 
        ,dbo.mod_employmentAppJobTitles.title AS JobTitle 
        ,dbo.mod_employmentAppQuestionTypes.type AS QuestionType    
    FROM dbo.mod_employmentAppQuestionAnswers 
        FULL JOIN dbo.mod_employmentAppQuestionDefinitions 
            ON dbo.mod_employmentAppQuestionAnswers.questionDefinitionID = dbo.mod_employmentAppQuestionDefinitions.definitionID 
        INNER JOIN dbo.mod_employmentAppJobTitles 
            ON dbo.mod_employmentAppQuestionDefinitions.jobTitleID = dbo.mod_employmentAppJobTitles.jobTitleID 
        LEFT JOIN dbo.mod_employmentAppQuestionTypes 
            ON dbo.mod_employmentAppQuestionDefinitions.questionTypeID = dbo.mod_employmentAppQuestionTypes.questionTypeID
    WHERE   
        (dbo.mod_employmentAppQuestionDefinitions.jobTitleID = 
                <cfqueryparam cfsqltype="cf_sql_integer" value="#jobTitleID#" />) AND
        (dbo.mod_employmentAppQuestionAnswers.AppID = 
                <cfqueryparam cfsqltype="cf_sql_integer" value="#applicationID#" />)   

Дизайн базы данных ниже: Database design

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Я бы использовал слева. Я не уверен, что вы использовали FULL JOIN намеренно, за исключением попыток получить лучшие результаты, верно? Также, пожалуйста, научитесь использовать псевдонимы для таблиц в ваших объединениях - я обещаю, что люди, которые должны читать ваш код, будут вам благодарны.

SELECT     
    a.questionID 
    ,a.questionDefinitionID 
    ,a.AppID 
    ,a.questionText 
    ,a.questionDate1 
    ,a.questionDate2 
    ,a.questionBit 
    ,d.definitionID 
    ,d.jobTitleID 
    ,d.title AS QuestionTitle 
    ,d.questionTypeID 
    ,d.description 
    ,d.isActive 
    ,t.title AS JobTitle 
    ,qt.type AS QuestionType    
FROM
    dbo.mod_employmentAppQuestionDefinitions AS d
LEFT OUTER JOIN 
    dbo.mod_employmentAppQuestionAnswers AS a 
    ON a.questionDefinitionID = d.definitionID 
    AND a.AppID = <cfqueryparam cfsqltype="cf_sql_integer" value="#applicationID#" />
LEFT OUTER JOIN
    dbo.mod_employmentAppJobTitles AS t
    ON d.jobTitleID = t.jobTitleID 
LEFT OUTER JOIN 
    dbo.mod_employmentAppQuestionTypes AS qt
    ON d.questionTypeID = qt.questionTypeID
WHERE   
    d.jobTitleID = <cfqueryparam cfsqltype="cf_sql_integer" value="#jobTitleID#" />
0 голосов
/ 26 сентября 2011

Просто вы должны использовать левое внешнее соединение там ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...