Sql 在不同列上使用多个条件进行选择

Sql 在不同列上使用多个条件进行选择,sql,sql-server,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/

好吧,我相信我走在正确的轨道上,但是在获得想要的结果时有一些困难。我试图检查表中的两个不同列是否有特定的标志,然后将所述标志与第二列关联

例如,我说过:

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
需要输出的是包含repeat
flag\u 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

这里犯了一个初学者错误,请注意,我对这一点还是很陌生的,因此,请解释一下为什么这一点不起作用或为什么其他东西起作用。您的输出对查询没有意义。这将返回标记为“否”的所有行,但还有一行标记为“否”。请注意,如果查询停止,则使用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'
选择distinct
其他身份证,
其他日期,
另一面国旗,
t_other.flag_id,
表1中的t_编号
内部联接表1 t_no.flag_id=t_other.flag_id上的t_other
其中t_no.flag='no'和t_other.flag'no'

您可以改用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')
当您有多个不同的标志时也可以使用:

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)
;
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')
| 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

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)
;
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')
| 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 |

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)
;
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')
| 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 |

我看不出你怎么可能为那里的结果获取不同的ID,除非你运行的是不同的查询,或者我误解了你的问题。重新格式化并删除了示例,这现在应该更有意义了,因为我只是尝试获取上面列出的结果。:)是的,这是一个有效的方法。我很喜欢这个答案,现在我有一个更有趣的情况。假设数据集包括3个不同的标志(
NO,OTHER,OTHER2
),我想输出所有具有重复的
flag\u id
s的行,但排除具有
NO
的行,那么如何处理呢?另外,假设标志的数量最多为100个,并且没有精确指定每个
标志。@maaier我建议尝试这两种解决方案。我希望他们返回相同的答案,但是cha的答案会运行得更有效,因为您希望从结果集中消除否定。