假设我有一个正常的 SELECT 调用,例如(嗯,这个问题真的很简化):
SELECT * FROM table WHERE column_b = "X" and column_c = "Y"
但我还想排除column_a(主键)与任何其他匹配结果column_k匹配的结果。 我想我可以这样做(我还没有测试过这个,因为这不是我想要的方式)
SELECT * FROM table WHERE column_b = "X" AND column_c = "Y"
AND column_k NOT IN
(SELECT column_a FROM table WHERE column_b = "X" AND column_c = "Y")
作为 DRY 编程的大力倡导者,我不喜欢这种方法几乎重复整个 SELECT 调用,如果它甚至有效的话。 有没有更好的方法可以做到这一点?
一种方法是使用您的基本逻辑创建一个视图:
CREATE VIEW myview
AS
SELECT *
FROM mytable
WHERE column_b = 'X' AND column_c = 'Y'
现在,可以重用此逻辑:
SELECT *
FROM myview
WHERE column_a NOT IN (SELECT column_k FROM myview)
我不这么认为。 该表必须在某处的查询中有 2 个实例。 您只需要确保它利用索引而不是执行全表扫描即可完成比较。 另一种方法是不存在而不是in。 我知道这在MySQL中表现更好。 不确定它是否与 sql lite 有所不同。
SELECT * FROM table t1 WHERE column_b = "X" AND column_c = "Y"
AND column_a NOT Exists
(SELECT NULL FROM table t2 WHERE column_b = "X" AND column_c = "Y" and t2.column_k = t1.column_a)