MS Access查询过于复杂(多个OR条件)

时间:2014-07-24 07:44:58

标签: sql asp.net-mvc-2 ms-access-2007

我有查询在运行时动态生成我可能有一个或1000个项目在这里是查询

    SELECT DISTINCT nss.SubmitId,CD.ControlName, nss.ItemName, nss.ItemValue,
 nss.ExternalFile FROM (SELECT * FROM SubmitData AS sd WHERE ( sd.ItemName = @ItemName1 OR
 sd.ItemName = @ItemName2 OR sd.ItemName = @ItemName3 OR sd.ItemName = @ItemName4 OR
 sd.ItemName = @ItemName5 OR sd.ItemName = @ItemName6 OR sd.ItemName = @ItemName7 OR 
sd.ItemName = @ItemName8 OR sd.ItemName = @ItemName9 OR sd.ItemName = @ItemName10 OR 
sd.ItemName = @ItemName11 OR sd.ItemName = @ItemName12 OR sd.ItemName = @ItemName13 OR 
sd.ItemName = @ItemName14 OR sd.ItemName = @ItemName15 OR sd.ItemName = @ItemName16 OR 
sd.ItemName = @ItemName17 OR sd.ItemName = @ItemName18 OR sd.ItemName = @ItemName19 OR 
sd.ItemName = @ItemName20 OR sd.ItemName = @ItemName21 OR sd.ItemName = @ItemName22 OR 
sd.ItemName = @ItemName23 OR sd.ItemName = @ItemName24 OR sd.ItemName = @ItemName25 OR 
sd.ItemName = @ItemName26 OR sd.ItemName = @ItemName27 OR sd.ItemName = @ItemName28 OR 
sd.ItemName = @ItemName29 OR sd.ItemName = @ItemName30 OR sd.ItemName = @ItemName31 OR 
sd.ItemName = @ItemName32 OR sd.ItemName = @ItemName33 OR sd.ItemName = @ItemName34 OR 
sd.ItemName = @ItemName35 OR sd.ItemName = @ItemName36 OR sd.ItemName = @ItemName37 OR 
sd.ItemName = @ItemName38 OR sd.ItemName = @ItemName39 OR sd.ItemName = @ItemName40 OR 
sd.ItemName = @ItemName41 OR sd.ItemName = @ItemName42 OR sd.ItemName = @ItemName43 OR 
sd.ItemName = @ItemName44 OR sd.ItemName = @ItemName45 OR sd.ItemName = @ItemName46 OR 
sd.ItemName = @ItemName47 OR sd.ItemName = @ItemName48 OR sd.ItemName = @ItemName49 OR 
sd.ItemName = @ItemName50 OR sd.ItemName = @ItemName51 OR sd.ItemName = @ItemName52 OR 
sd.ItemName = @ItemName53 OR sd.ItemName = @ItemName54 OR sd.ItemName = @ItemName55 OR 
sd.ItemName = @ItemName56 OR sd.ItemName = @ItemName57 OR sd.ItemName = @ItemName58 OR 
sd.ItemName = @ItemName59 OR sd.ItemName = @ItemName60 OR sd.ItemName = @ItemName61 OR 
sd.ItemName = @ItemName62 OR sd.ItemName = @ItemName63 OR sd.ItemName = @ItemName64 OR 
sd.ItemName = @ItemName65 OR sd.ItemName = @ItemName66 OR sd.ItemName = @ItemName67 OR 
sd.ItemName = @ItemName68 OR sd.ItemName = @ItemName69 OR sd.ItemName = @ItemName70 OR 
sd.ItemName = @ItemName71 OR sd.ItemName = @ItemName72 OR sd.ItemName = @ItemName73 OR 
sd.ItemName = @ItemName74 OR sd.ItemName = @ItemName75 OR sd.ItemName = @ItemName76 OR 
sd.ItemName = @ItemName77 OR sd.ItemName = @ItemName78 OR sd.ItemName = @ItemName79 OR 
sd.ItemName = @ItemName80 OR sd.ItemName = @ItemName81 OR sd.ItemName = @ItemName82 OR 
sd.ItemName = @ItemName83 OR sd.ItemName = @ItemName84 OR sd.ItemName = @ItemName85 OR 
sd.ItemName = @ItemName86 OR sd.ItemName = @ItemName87 OR sd.ItemName = @ItemName88 OR 
sd.ItemName = @ItemName89 OR sd.ItemName = @ItemName90 OR sd.ItemName = @ItemName91 OR 
sd.ItemName = @ItemName92 OR sd.ItemName = @ItemName93 OR sd.ItemName = @ItemName94 OR 
sd.ItemName = @ItemName95 OR sd.ItemName = @ItemName96 OR sd.ItemName = @ItemName97 OR 
sd.ItemName = @ItemName98 OR sd.ItemName = @ItemName99 OR sd.ItemName = @ItemName100 OR 
sd.ItemName = @ItemName101 OR sd.ItemName = @ItemName102 OR sd.ItemName = @ItemName103 OR 
sd.ItemName = @ItemName104 OR sd.ItemName = @ItemName105 OR sd.ItemName = @ItemName106 OR 
sd.ItemName = @ItemName107 OR sd.ItemName = @ItemName108 OR sd.ItemName = @ItemName109 OR 
sd.ItemName = @ItemName110 OR sd.ItemName = @ItemName111 OR sd.ItemName = @ItemName112 OR 
sd.ItemName = @ItemName113 OR sd.ItemName = @ItemName114 OR sd.ItemName = @ItemName115 OR 
sd.ItemName = @ItemName116 OR sd.ItemName = @ItemName117 OR sd.ItemName = @ItemName118 OR 
sd.ItemName = @ItemName119 OR sd.ItemName = @ItemName120 OR sd.ItemName = @ItemName121 OR 
sd.ItemName = @ItemName122 OR sd.ItemName = @ItemName123 OR sd.ItemName = @ItemName124 OR 
sd.ItemName = @ItemName125 OR sd.ItemName = @ItemName126 OR sd.ItemName = @ItemName127 OR 
sd.ItemName = @ItemName128 OR sd.ItemName = @ItemName129 OR sd.ItemName = @ItemName130 OR 
sd.ItemName = @ItemName131 OR sd.ItemName = @ItemName132 OR sd.ItemName = @ItemName133 OR 
sd.ItemName = @ItemName134 OR sd.ItemName = @ItemName135 OR sd.ItemName = @ItemName136 OR 
sd.ItemName = @ItemName137 OR sd.ItemName = @ItemName138 OR sd.ItemName = @ItemName139 OR 
sd.ItemName = @ItemName140 OR sd.ItemName = @ItemName141 OR sd.ItemName = @ItemName142 OR 
sd.ItemName = @ItemName143 OR sd.ItemName = @ItemName144 OR sd.ItemName = @ItemName145 OR 
sd.ItemName = @ItemName146 OR sd.ItemName = @ItemName147 OR sd.ItemName = @ItemName148 OR 
sd.ItemName = @ItemName149 OR sd.ItemName = @ItemName150 OR sd.ItemName = @ItemName151 OR 
sd.ItemName = @ItemName152 OR sd.ItemName = @ItemName153 OR sd.ItemName = @ItemName154 OR 
sd.ItemName = @ItemName155 OR sd.ItemName = @ItemName156 OR sd.ItemName = @ItemName157 OR 
sd.ItemName = @ItemName158 OR sd.ItemName = @ItemName159 OR sd.ItemName = @ItemName160 OR 
sd.ItemName = @ItemName161 OR sd.ItemName = @ItemName162 OR sd.ItemName = @ItemName163 OR 
sd.ItemName = @ItemName164 OR sd.ItemName = @ItemName165 OR sd.ItemName = @ItemName166 OR 
sd.ItemName = @ItemName167 OR sd.ItemName = @ItemName168 OR sd.ItemName = @ItemName169 OR 
sd.ItemName = @ItemName170 OR sd.ItemName = @ItemName171 OR sd.ItemName = @ItemName172 OR 
sd.ItemName = @ItemName173 OR sd.ItemName = @ItemName174 OR sd.ItemName = @ItemName175 OR 
sd.ItemName = @ItemName176 OR sd.ItemName = @ItemName177 OR sd.ItemName = @ItemName178 OR 
sd.ItemName = @ItemName179 OR sd.ItemName = @ItemName180 OR sd.ItemName = @ItemName181 OR 
sd.ItemName = @ItemName182 OR sd.ItemName = @ItemName183 OR sd.ItemName = @ItemName184 OR 
sd.ItemName = @ItemName185 OR sd.ItemName = @ItemName186 OR sd.ItemName = @ItemName187 OR 
sd.ItemName = @ItemName188 OR sd.ItemName = @ItemName189 OR sd.ItemName = @ItemName190 OR 
sd.ItemName = @ItemName191 OR sd.ItemName = @ItemName192 OR sd.ItemName = @ItemName193 OR 
sd.ItemName = @ItemName194 OR sd.ItemName = @ItemName195 OR sd.ItemName = @ItemName196 OR 
sd.ItemName = @ItemName197 OR sd.ItemName = @ItemName198 OR sd.ItemName = @ItemName199 OR 
sd.ItemName = @ItemName200 OR sd.ItemName = @ItemName201 OR sd.ItemName = @ItemName202 OR 
sd.ItemName = @ItemName203 OR sd.ItemName = @ItemName204 OR sd.ItemName = @ItemName205 ) 
AND sd.SubmitId='20140723210127429') AS nss   LEFT JOIN CSVData AS CD ON nss.ItemName = 
CD.ControlKey WHERE CD.FileId = @FileId

正如你可以看到itemName的很多参数,根据用户的选择可以b 10或1000,当我执行这个查询它给我复杂查询异常,有没有其他方法我可以在MS ACCSS2007中运行相同的查询 以下是生成此查询的代码

 cmd.CommandText = String.Format(@"SELECT DISTINCT nss.SubmitId,CD.ControlName, nss.ItemName, nss.ItemValue, nss.ExternalFile FROM (SELECT * FROM SubmitData AS sd WHERE ({0}) AND sd.SubmitId='" + sid + "') AS nss   LEFT JOIN CSVData AS CD ON nss.ItemName = CD.ControlKey WHERE CD.FileId = @FileId", strItemsQuery2);
                            intItemsIndex2 = 1;

                            int length= sheet.g.Count(); 
                            foreach (var gItems in sheet.g)
                            {
                                cmd.Parameters.AddWithValue("@ItemName" + intItemsIndex2, gItems[0]);
                                intItemsIndex2++;
                            }
                            cmd.Parameters.AddWithValue("@FileId", FileId);
                            OleDbDataReader reader4 = cmd.ExecuteReader();

1 个答案:

答案 0 :(得分:1)

您可以使用“IN”子句。我想它最多可以接受1000个值。

SELECT DISTINCT nss.SubmitId,CD.ControlName, nss.ItemName, nss.ItemValue, nss.ExternalFile 
FROM 
    (   SELECT * FROM SubmitData AS sd 
        WHERE sd.ItemName IN (@ItemName1, @ItemName2, @ItemName3, @ItemName4, @ItemName5, ................... up to 1000 values) 
        AND sd.SubmitId='20140723210127429'
    ) AS nss   
LEFT JOIN CSVData AS CD ON nss.ItemName =  CD.ControlKey WHERE CD.FileId = @FileId