我有一些麻烦(想一想)从这张表中做出选择。
tb_details :
id status det_id
1 5 22
2 1 22
3 0 22
4 5 25
5 1 25
6 5 27
7 1 27
8 5 32
9 1 32
10 0 32
如何制作一个选择查询以显示表格中没有det_id
的{{1}}值,可能是这样的:< / p>
0
答案 0 :(得分:3)
一种方法(在几种可行的方法中)是使用反连接模式。
SELECT t.det_id
FROM this_table t
LEFT
JOIN ( SELECT r.det_id
FROM this_table r
WHERE r.status = 0
GROUP BY r.det_id
) s
ON s.det_id = t.det_id
WHERE s.det_id IS NULL
GROUP BY t.det_id
让我们解开一点。
内嵌视图(别名为 s
)会返回一个det_id
值的明确列表,status=0
行中存在this_table
行
LEFT JOIN
操作会返回det_id
this_table
中的所有t
值,以及来自的匹配det_id
s
即可。如果未找到匹配项,则联接的“左外部”意味着将返回 t
中的所有行,无论是否找到匹配项。
“技巧”是WHERE
子句中的谓词,用于测试从 s
返回的列的值是否为NULL。该谓词有效地排除了 t
中的任何行,这些行在 s
中找到了匹配的行。
因此,剩下要归还的是来自 t
的行 s
中没有匹配的行。
我们添加GROUP BY t.det_id
(或者我们可以添加DISTINCT
关键字),以返回不同det_id
值的列表。
这不是唯一的方法。您还可以使用NOT EXISTS
谓词...
SELECT t.det_id
FROM this_table t
WHERE NOT EXISTS
( SELECT 1
FROM this_table r
WHERE r.det_id = t.det_id
AND r.status = 0
)
GROUP BY t.det_id
(这略有不同,因为可以返回det_id
的NULL值的行,前一个查询不会返回它。可以调整第一个查询以使其返回与此相同的结果。)
您也可以使用NOT IN
,注意子查询不返回det_id
的任何NULL值。
SELECT t.det_id
FROM this_table t
WHERE t.det_id NOT IN
( SELECT r.det_id
FROM this_table r
WHERE r.status = 0
AND r.det_id IS NOT NULL
GROUP BY r.det_id
)
GROUP BY t.det_id
有几个语句将返回指定的结果集。
答案 1 :(得分:1)
另一种更简单的方法是: -
SELECT DISTINCT det_id FROM TB
WHERE det_id NOT IN
(SELECT det_id RFOM TB WHERE status = 0);
答案 2 :(得分:0)
如果你想只有det_id,其他列不是0你应该写
SELECT det_id FROM TABLE WHERE
Col1 <> 0
AND
Col2 <> 0
依旧......
如果每个类型只需要1个结果添加
GROUP BY det_id
在查询结束时。