选择不同列上的多个条件

时间:2017-09-25 23:27:42

标签: sql sql-server

好吧,我相信我走在正确的轨道上,但在获得理想的结果方面遇到了一些困难。我正在尝试检查表中的两个不同列以获取特定标志,然后将所述标志与第二列相关联。

例如,我说过表:

ID   date       flag      flag_id 
-----------------------------------
1  09/25/2017   NO        0001
2  09/25/2017   OTHER     0002
3  09/25/2017   NO        0002
4  09/25/2017   OTHER     0003
5  09/25/2017   OTHER     0004
6  09/25/2017   NO        0005
7  09/25/2017   OTHER2    0005
8  09/25/2017   OTHER     0006

需要输出的是包含重复flag_id的行以及仅在其标志列中包含NO的行,不包括NO行本身(因此只有行数据未显示NO)。所以在这种情况下只输出第2行和第7行。我已经写了一些看起来像这样的东西:

SELECT distinct
   t1.ID,
   t1.date,
   t1.flag,
   t1.flag_id,
FROM table1 t1
WHERE (SELECT COUNT(*)
   FROM table1 t2
   WHERE t1.flag_id = t2.flag_id
   AND t1.flag != 'NO'
   AND t2.flag = 'NO')>1

在这里犯了一个初学者的错误,并且请注意,我对此仍然很陌生,所以对于为什么这不起作用或为什么其他工作原理的解释将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以改用EXISTS:

SELECT 
   t1.ID,
   t1.date,
   t1.flag,
   t1.flag_id
FROM table1 t1
WHERE exists (SELECT 1
       FROM table1 t2
   WHERE t1.flag_id = t2.flag_id
   AND t1.flag != 'NO'
   AND t2.flag = 'NO')

当您有多个不同的标志时也可以使用:

SQL Fiddle

MS SQL Server 2014架构设置

CREATE TABLE Table1
    ([ID] int, [date] datetime, [flag] varchar(10), [flag_id] int)
;

INSERT INTO Table1
    ([ID], [date], [flag], [flag_id])
VALUES
    (1, '2017-09-25 10:00:00', 'NO', 0001),
    (2, '2017-09-25 10:00:00', 'OTHER', 0002),
    (3, '2017-09-25 10:00:00', 'NO', 0002),
    (4, '2017-09-25 10:00:00', 'OTHER', 0003),
    (5, '2017-09-25 10:00:00', 'OTHER', 0004),
    (6, '2017-09-25 10:00:00', 'NO', 0005),
    (7, '2017-09-25 10:00:00', 'OTHER', 0005),
    (8, '2017-09-25 10:00:00', 'OTHER2', 0005),
    (9, '2017-09-25 10:00:00', 'OTHER', 0006)
;

查询1

SELECT 
   t1.ID,
   t1.date,
   t1.flag,
   t1.flag_id
FROM table1 t1
WHERE exists (SELECT 1
       FROM table1 t2
   WHERE t1.flag_id = t2.flag_id
   AND t1.flag != 'NO'
   AND t2.flag = 'NO')

<强> Results

| ID |                 date |   flag | flag_id |
|----|----------------------|--------|---------|
|  2 | 2017-09-25T10:00:00Z |  OTHER |       2 |
|  7 | 2017-09-25T10:00:00Z |  OTHER |       5 |
|  8 | 2017-09-25T10:00:00Z | OTHER2 |       5 |

答案 1 :(得分:0)

您的输出对查询没有意义。这将返回标志不是No的所有行但是还有另一行标志为No。请注意,如果这是查询停止的位置,则使用exists更有效。如果您想扩展查询,可能会更好。

SELECT distinct
   t_other.ID,
   t_other.date,
   t_other.flag,
   t_other.flag_id,
FROM table1 t_no
     inner join table1 t_other on t_no.flag_id = t_other.flag_id
WHERE t_no.flag = 'NO' and t_other.flag <> 'NO'