我有一个复杂的SQL查询,它使用很多连接和条件编写。
ComplexQuery的列数很少,而最值得注意的列名是WeightCode
和DrugName
。
[假设]:Select * from ComplexQuery
。
我有第二张表:Select DrugName from Table2
。
我的要求就是这样,
如果WeightCode = 2,则应删除ComplexQuery的DrugName的前五个字母,以匹配表2中DrugName的前五个字母。
我很难接近..!我应该如何在单个连接查询中定义过滤条件??
答案 0 :(得分:2)
利用Case..When
可以解决您的问题
示例
SELECT column1, column2
FROM TABLE
WHERE
column1 =
CASE @locationType
WHEN 'val1' THEN column1
WHEN 'val2' THEN column1
END
注意:这只是示例
答案 1 :(得分:0)
您还可以使用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 = 2
除了从第一个结果集中删除第二个结果集。唯一的问题是你需要在两个集合中返回相同的字段,就像在UNION
中一样。
答案 2 :(得分:0)
所以,如果 ComplexQuery.WeightCode = 2, if ,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)
答案 3 :(得分:0)
一起使用2个查询和全部联盟。
在第一个查询中获取WeightCode = 2的数据。连接和子字符串是否返回所需的结果。
第二个查询获取WeightCode!= 2的数据。以相同的顺序返回相同的字段名称和类型。
在它们之间放置一个联合,将结果连接到一个结果集中。