需要简化多个Select查询

时间:2013-01-16 03:51:26

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

这是我现有SQL查询的结构:

SELECT * FROM (

    SELECT *, 'A' AS Status FROM Table1
    WHERE Field1 NOT IN 
    (
    SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
    )

    UNION

    SELECT *, 'B' AS Status FROM Table1
    WHERE Field1 IN 
    (
    SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
    )

) AS Result

在这里,我从一个表中选择两组数据,并为Status列分配两个不同的值(A& B),并将Union设置为一个作为结果。

这个方法的问题是,它需要复制内部选择查询SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...(我原来的sql查询比上面显示的有点复杂)

如何将其重写为单个Select查询?有可能吗?

4 个答案:

答案 0 :(得分:2)

您可以简单地将WHERE条件移动到CASE表达式,如下所示:

SELECT
  *,
  CASE 
    WHEN Field1 IN (
      SELECT Field1 FROM Table2 WHERE Field1 = 'val' AND ...
    )
    THEN 'B'
    ELSE 'A'
  END AS Status
FROM Table1
;

您也可以像其他人建议的那样使用LEFT JOIN方法,但如果Table2为指定的过滤器生成重复项,您也可能在输出中获得重复项。为避免这种情况,您可能需要使用仅返回不同值的派生表,如下所示:

SELECT
  t1.*,
  CASE 
    WHEN t2.Field1 IS NULL THEN 'A'
    ELSE 'B'
  END AS Status
FROM Table1 t1
LEFT JOIN (
  SELECT DISTINCT Field1 FROM Table2 WHERE Field1 = 'val' AND ...
) t2
  ON t1.Field1 = t2.Field2
;

答案 1 :(得分:0)

您可以在此处使用LEFT JOIN

SELECT  a.*,
        CASE WHEN b.field1 IS NULL
            THEN 'A'
            ELSE 'B'
        END AS Status
FROM    table1 a
        LEFT JOIN table2 b
            ON a.field1 = b.field1 AND
                b.field1 = 'VAL'

答案 2 :(得分:0)

请检查以下查询,如果Field1=’val’上只有一个Table2条件,则该查询有效。如果有多个where条件,请转到LEFT JOIN

SELECT 
    *,
    (CASE WHEN Field1='val' THEN 'B' ELSE 'A' END) AS Status 
FROM 
    Table1

答案 3 :(得分:0)

您可以使用LEFT JOINCASE完成此操作,如下所示

SELECT  a.*,
    (CASE b.Field1
           WHEN 'Val' 
           THEN 'B' ELSE 'A' END) as status
FROM  Table1 a LEFT JOIN Table2 b ON a.field1 =b.field1 

如果状态有多个条件,请尝试以下

SELECT  a.*,
    (CASE 
           WHEN (SELECT COUNT(Field1) 
                 FROM Table2 
                 WHERE field1 =a.field1 AND Field 1 ='val' AND ...) >0
           THEN 'B' ELSE 'A' END) as status
FROM  Table1 a LEFT JOIN Table2 b ON a.field1 =b.field1