有没有办法根据自己的结果排除查询结果?

时间:2015-01-31 22:06:54

标签: sql sqlite

说我有一个普通的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调用,如果它甚至可以工作的话。有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

一种方法是使用基本逻辑创建视图:

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)

答案 1 :(得分:0)

我不这么认为。该表必须在查询中的某个地方有2个实例。您只需要确保它使用索引而不是进行全表扫描来完成比较。另一种方法是不存在而不是存在。我知道在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)