2017-09-25 40 views
0

好的,我相信我在正确的轨道上,但有一些难以取得预期的结果。我试图检查表中的特定标志的两个不同列,然后将所述标志与第二列相关联。选择不同列上的多个条件

例如,我所说表:

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 

这里制作一个初学者的错误,而你我心中还是很新的这一点,所以在解释为什么这不起作用或为什么其他作品将不胜感激。

+0

我不知道它是如何,甚至可能让你获得一个不同的ID为结果那里,除非你正在运行一个不同的查询或我误解你的问题。 – ZLK

+0

重新格式化和删除的例子,这应该更有意义,因为我只是想获得上面列出的结果。 :) – maaier

回答

1

您可以使用EXISTS来代替:

SQL Fiddle

MS SQL服务器2014架构设置

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

当你有多个不同的标志,也适用此

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 | 
+0

是的,这是一个有效的方法来做到这一点。 – LAS

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' 
+0

我喜欢这个答案,现在我有一个更有趣的情况。假设数据集包含3个不同的标志('NO,OTHER,OTHER2'),并且我想输出所有具有重复'flag_id'的行,但是排除具有“NO”的行,那么这个怎么办呢?同样假设标志的数量可以达到100,并且不准确地指定每个“标志”。 – maaier

+0

@maaier我建议尝试这两种解决方案。我期望他们返回相同的答案,但是cha的答案会更有效率地运行,因为您希望消除结果集中的No。 – LAS