1

这是我现有 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 都设置为一个作为 Result。

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

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

4

4 回答 4

2

You could simply move the WHERE condition to a CASE expression, like this:

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

You could also use a LEFT JOIN method like others suggested, but if Table2 produces duplicates for the specified filter, you might get duplicates in the output as well. To avoid that, you would probably need to use a derived table that only returns distinct values, something like this:

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
;
于 2013-01-16T09:58:29.560 回答
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'
于 2013-01-16T03:54:50.070 回答
0
于 2013-01-16T04:03:33.430 回答
0

U can achieve this by using LEFT JOIN and CASE as follows

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 

If multiple conditions are there for status try the following one

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 
于 2013-01-16T05:35:35.630 回答