我有一个复杂的SQL查询,其中编写了许多连接和条件。
ComplexQuery的列很少,最著名的列名是WeightCode和DrugName。
假设:Select * from ComplexQuery。
我还有第二个表:Select DrugName from Table2。
我的要求是这样的,
如果WeightCode = 2,则应删除来自ComplexQuery的DrugName的前五个字母与表2中DrugName的前五个字母相匹配。
我对接近..感到迷惑!如何定义带有筛选条件的单连接查询??
发布于 2011-06-03 04:32:00
使用Case..When可能会解决您的问题
示例
SELECT column1, column2
FROM TABLE
WHERE
column1 =
CASE @locationType
WHEN 'val1' THEN column1
WHEN 'val2' THEN column1
END注意:这只是一个例子
发布于 2011-06-03 04:33:27
您还可以对NOT IN或EXISTS使用子选择。
列出要在子查询中排除的内容,并使用连接条件将其与外部查询关联起来。
也就是说。
WHERE MainTableKey NOT IN (SELECT ForeignKey from MyTable2
WHERE DoNotInclude = 1)编辑:
替代解决方案,使用EXCEPT
伪码为:
SELECT col1, col2, col3
FROM ComplexQuery
EXCEPT
SELECT Col1, Col2, Col3
FROM MyTable t1
INNER JOIN Table2 t2
ON LEFT(t1.Drugname, 5) = LEFT(t2.drugname, 5)
AND t1.WeightCode = 2Except从第一个结果集中删除第二个结果集。唯一的问题是需要在两个集合中返回相同的字段,就像在UNION中一样。
发布于 2011-06-03 04:40:40
因此,如果ComplexQuery.WeightCode = 2,并且如果WeightCode.DrugName的前五个字母可以与Table2.DrugName中任何记录的前五个字母匹配,那么您想从ComplexQuery.WeightCode中删除前五个字母吗?
如果是这样的话,试试这个:
SELECT cq.*,
CASE cq.WeightCode WHEN 2 THEN RIGHT(cq.DrugName, LEN(cq.DrugName)-5) ELSE cq.DrugName END DrugName
FROM ComplexQuery cq
LEFT OUTER JOIN Table2 t
ON cq.WeightCode = 2 AND LEFT(cq.DrugName, 5) = LEFT(t2.DrugName, 5)https://stackoverflow.com/questions/6220012
复制相似问题