【发布时间】:2019-09-25 20:13:12
【问题描述】:
我想选择没有任何 VAL = 'current' 的行的不同 ID(与多行相关联)。
例如,在这样的表中:
PK | ID | VAL
-------------
1 | 23 | deleted
2 | 23 | deleted
3 | 23 | deleted
4 | 45 | current
5 | 45 | deleted
6 | 45 | deleted
...|................
我希望它返回 ID 23,因为它没有 VAL='current' 的行。请注意,在此表中,主键 (PK) 是唯一的,但 ID 不是唯一的(因此需要使用 DISTINCT 或 GROUP BY)。
这是我在 PHP 中所拥有的:
$conn = someConnect("");
// returns ids associated with the number of rows they have where VAL != 'current'
$sql = "SELECT id, count(*) FROM table WHERE val != 'current' GROUP BY id"
$stid = oci_parse($conn, $sql);
oci_execute($stid);
oci_fetch_all($stid, $arr, OCI_FETCHSTATEMENT_BY_ROW);
foreach ($arr as $elm) {
$id = key($elm);
$non_current_count = $elm[$id];
// counts the number of rows associated with the id, which includes VAL = 'current' rows
$sql2 = "SELECT count(*) FROM table WHERE id = $id";
$stid2 = oci_parse($conn, $sql2);
oci_execute($stid2);
$total_count = oci_fetch_array...
if ($total_count != $non_current_count) {
$output[] = $id;
}
...
}
oci_close($conn);
这就是它的一般要点。如您所见,完成此任务需要两条 SQL 语句。有没有更短的方法?
【问题讨论】:
-
你想要的输出是什么
-
我想选择所有没有与之关联的行的 ID,其中 VAL = 'current'。
-
您使用的是哪个 DBMS?