仅在满足特定条件时才连接表

时间:2011-03-16 00:35:19

标签: sql sqlite

我正在尝试编写一个只在满足某个条件时才执行JOIN的SQLite查询(items.super = 1)。我知道我可以在我的应用程序中编写一些代码来判断super == 1然后执行正确的查询,但我更倾向于只有一个查询在两种情况下都有效 - 无论super是0还是1。 / p>

SELECT i2.id, i2.name
FROM items i
JOIN items i2 ON i.subcategory_id = i2.subcategory_id AND i.super = 1
WHERE i.id = ?

上面,我尝试在我的JOIN子句中添加第二个条件,但是当i.super == 0时这不起作用。我应该用两个左连接和coalesce()函数这样的东西解决这个问题吗? / p>

感谢。

4 个答案:

答案 0 :(得分:5)

这就是我读这个问题的方法。

您想要显示项目中的记录,WHERE过滤器将应用于该项目 但是,有时当前项目的超级= 1,您希望显示所有兄弟项目而不是相同的子类别。

在这种情况下,您可以使用此查询

SELECT i2.id, i2.name
FROM items i
INNER JOIN items i2 ON
    (i.super = 0 and i2.id = i.id)
    OR
    (i.super = 1 and i.subcategory_id = i2.subcategory_id)
WHERE i.id = ?

答案 1 :(得分:1)

不确定我是否理解你想要的东西。

SELECT i2.id, i2.name
  FROM items i
    JOIN items i2 
      ON i.subcategory_id = i2.subcategory_id 
        AND (i.super = 1 OR i.super = 0)
;

答案 2 :(得分:0)

不是你想要的:

SELECT i2.id, i2.name
FROM items i
JOIN items i2 ON (i.subcategory_id = i2.subcategory_id AND (i.super = 1 OR i.super = 0))
WHERE i.id = ?

答案 3 :(得分:0)

我和其他所有不确定他们是否理解这个问题的人在一起,但既然你问的是coalesce(),我认为一个左连接就足够了:

SELECT coalesce(i.id, i2.id), coalesce(i.name, i2.name)
FROM items i
LEFT JOIN items i2 ON i.subcategory_id = i2.subcategory_id AND i.super = 1
WHERE i.id = ?

或者,使用一个程序

SELECT i.id, i.name, i.super, i2.id, i2.name
FROM items i
LEFT JOIN items i2 ON i.subcategory_id = i2.subcategory_id AND i.super = 1
WHERE i.id = ?

让您的应用程序决定在运行查询之后使用哪些列,而不是之前。