使用Join Query在SQL Query中过滤

时间:2011-06-02 20:29:09

标签: sql sql-server sql-server-2005 sql-server-2008

我有一个复杂的SQL查询,它使用很多连接和条件编写。

ComplexQuery的列数很少,而最值得注意的列名是WeightCodeDrugName

[假设]:Select * from ComplexQuery

我有第二张表:Select DrugName from Table2

我的要求就是这样,

如果WeightCode = 2,则应删除ComplexQuery的DrugName的前五个字母,以匹配表2中DrugName的前五个字母。

我很难接近..!我应该如何在单个连接查询中定义过滤条件??

4 个答案:

答案 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 INEXISTS

的子选择

列出要在子查询中排除的内容,并使用连接条件将其绑定回外部查询。

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的数据。以相同的顺序返回相同的字段名称和类型。

在它们之间放置一个联合,将结果连接到一个结果集中。