SQL:如何在同一行显示 WHERE IN 和 WHERE NOT IN?
Posted
技术标签:
【中文标题】SQL:如何在同一行显示 WHERE IN 和 WHERE NOT IN?【英文标题】:SQL: How to show the WHERE IN and WHERE NOT IN in the same line? 【发布时间】:2015-05-27 18:08:47 【问题描述】:各位大师早安。
基本上我想展示 3 张桌子。但我有一些条件:
显示表perangkat
,jenis_perangkat
,pasang
但只显示ID已保存在表sedia
上的数据(上面这3个表具有相同的ID名为kd_jp
并已保存在sedia
) 并且不要显示已保存在 pasang
上的 ID 数据。
运行上面的代码后,出现语法错误。它一直有效:
SELECT `perangkat`.`kd_jp`, `perangkat`.`no_seri`, `perangkat`.`status`,
`jenis_perangkat`.`nm_jp`, `jenis_perangkat`.`merk_jp`
FROM`perangkat`
INNER JOIN `jenis_perangkat`
ON `jenis_perangkat`.`kd_jp` = `perangkat`.`kd_jp`
WHERE perangkat.kd_jp IN (select sedia.kd_jp from sedia)
但是当我添加 NOT IN 时它不起作用:and where perangkat.kd_jp not in (select pasang.kd_jp from pasang);
所以这里是出现语法错误的查询:
SELECT `perangkat`.`kd_jp`, `perangkat`.`no_seri`, `perangkat`.`status`,
`jenis_perangkat`.`nm_jp`, `jenis_perangkat`.`merk_jp`
FROM`perangkat`
INNER JOIN `jenis_perangkat`
ON `jenis_perangkat`.`kd_jp` = `perangkat`.`kd_jp`
WHERE perangkat.kd_jp IN (select sedia.kd_jp from sedia)
AND where perangkat.kd_jp not in (select pasang.kd_jp from pasang);
【问题讨论】:
一个查询中不能有多个where
。您可以在其中有多个条件,但查询中只能存在where
。
【参考方案1】:
您只能有一个WHERE
子句。将WHERE ... AND WHERE ...
更改为WHERE ... AND ...
:
SELECT `perangkat`.`kd_jp`, `perangkat`.`no_seri`, `perangkat`.`status`,
`jenis_perangkat`.`nm_jp`, `jenis_perangkat`.`merk_jp`
FROM `perangkat`
INNER JOIN `jenis_perangkat`
ON `jenis_perangkat`.`kd_jp` = `perangkat`.`kd_jp`
WHERE perangkat.kd_jp IN (SELECT sedia.kd_jp FROM sedia)
AND perangkat.kd_jp NOT IN (SELECT pasang.kd_jp FROM pasang);
【讨论】:
【参考方案2】:你不能使用以及在哪里:
and where perangkat.kd_jp not in (select pasang.kd_jp from pasang);
只需使用和:
and where perangkat.kd_jp not in (select pasang.kd_jp from pasang);
SQL 语法选择语法是
select * from [table] WHERE ... AND ... AND ... OR ...
所以
SELECT `perangkat`.`kd_jp`, `perangkat`.`no_seri`, `perangkat`.`status`, `jenis_perangkat`.`nm_jp`, `jenis_perangkat`.`merk_jp`FROM`perangkat`INNER JOIN `jenis_perangkat` ON `jenis_perangkat`.`kd_jp` = `perangkat`.`kd_jp` where perangkat.kd_jp in (select sedia.kd_jp from sedia) and perangkat.kd_jp not in (select pasang.kd_jp from pasang);
更新
更好的解决方案是使用 EXISTS 而不是 IN 和 NOT IN
SELECT a.kd_jp, a.no_seri, a.status, b.nm_jp, b.merk_jp
FROM perangkat a
INNER JOIN jenis_perangkat b ON b.kd_jp = a.kd_jp
WHERE EXISTS (SELECT c.kd_jp FROM sedia c WHERE c.kd_jp = a.kd_jp)
AND NOT EXISTS (SELECT c.kd_jp FROM pasang c WHERE c.kd_jp = a.kd_jp);
【讨论】:
以上是关于SQL:如何在同一行显示 WHERE IN 和 WHERE NOT IN?的主要内容,如果未能解决你的问题,请参考以下文章
SQL - LEFT JOIN 和 WHERE 语句仅显示第一行