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
需要输出的是包含repeatflag\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的答案会运行得更有效,因为您希望从结果集中消除否定。