0

私は SQL の専門家ではなく、私の既存の古典的な ASP コードのバグを特定したため、すべての状況で機能するとは限りません。優れたSQL経験を持つ誰かが、両方の状況が発生したときのより複雑な状況を書くのを手伝ってくれることを願っています

If intItemType = SV_ITEM_TYPE_MATRIX次に、SQLのこの部分が使用されます

LEFT OUTER JOIN usd_matrixSets MS " &_
    "ON MS.itemID = SI.itemID " &_

しかし、intItemType <> SV_ITEM_TYPE_MATRIX その後は無視されます。

ご覧のとおり、どちらかまたは両方の状況のコードを書いていますが、これは実際には両方が発生する状況についてはカバーしていません。

コードは次のとおりです。

If intItemType = SV_ITEM_TYPE_MATRIX Then   
    strSQL = "SELECT SI.itemID, itemType, itemText, minimumValue, maximumValue, dataType, MS.matrixSetType, MS.matrixSetID " &_
             "FROM usd_SurveyItem SI " &_
             "LEFT OUTER JOIN usd_matrixSets MS " &_
             "ON MS.itemID = SI.itemID " &_
             "WHERE surveyID = " & intSurveyID &_
             " AND itemType " &_
             "In(" & SV_ITEM_TYPE_TEXTAREA & "," &_
                    SV_ITEM_TYPE_SINGLE_LINE & "," &_
                    SV_ITEM_TYPE_DATE & "," &_
                    SV_ITEM_TYPE_CHECKBOXES & "," &_
                    SV_ITEM_TYPE_RADIO & "," &_
                    SV_ITEM_TYPE_DROPDOWN & "," &_
                    SV_ITEM_TYPE_MATRIX & "," &_
                    SV_ITEM_TYPE_UPLOAD_FILE & ")" &_
             " AND pageID = " & intPageNumber &_
             " ORDER BY pageID, SI.orderByID "

        else            
    strSQL = "SELECT SI.itemID, itemType, itemText, minimumValue, maximumValue, dataType" &_
             " FROM usd_SurveyItem SI " &_
             "WHERE surveyID = " & intSurveyID &_
             " AND itemType " &_
             "In(" & SV_ITEM_TYPE_TEXTAREA & "," &_
                    SV_ITEM_TYPE_SINGLE_LINE & "," &_
                    SV_ITEM_TYPE_DATE & "," &_
                    SV_ITEM_TYPE_CHECKBOXES & "," &_
                    SV_ITEM_TYPE_RADIO & "," &_
                    SV_ITEM_TYPE_DROPDOWN & "," &_
                    SV_ITEM_TYPE_MATRIX & "," &_
                    SV_ITEM_TYPE_UPLOAD_FILE & ")" &_
             " AND pageID = " & intPageNumber &_
             " ORDER BY pageID, SI.orderByID "      

        end if      

私の問題は、データベース内に SV_ITEM_TYPE_MATRIX とその他の両方が同時に存在する場合があることです。このコードを書き直すにはどうすればよいですか?

4

1 に答える 1

2

常に LEFT JOIN を実行する必要があり、そうでない場合は余分な値 (MS.matrixSetTypeおよびMS.matrixSetID) をそのままNULLにしておく必要がありSV_ITEM_TYPE_MATRIXます。

次のようなもの (SQL インジェクションの脆弱性を回避するためにパラメーターを使用します):

SELECT 
    SI.itemID, itemType, itemText, minimumValue, maximumValue, dataType, 
    MS.matrixSetType, MS.matrixSetID 
FROM usd_SurveyItem SI
LEFT OUTER JOIN usd_matrixSets MS ON 
    MS.itemID = SI.itemID 
    AND @intItemType = SI.itemType
WHERE
    surveyID = @intSurveyID  
    AND itemType IN (
       ...
    )
    AND pageID = @intPageNumber 
ORDER BY 
    pageID, SI.orderByID
于 2012-06-01T21:01:45.977 に答える