sql 左连接有条件
sql left join with condition
我在 Android 中遇到 SQLite 问题:
从 items 我应该得到:
1) 标题字段包含字符串的所有项目。示例“%sho%”
2) 检查项目是否属于给定项目 (22)
project
┌───┬─────────┐
│ id│idProject│
├───┼─────────┤
│ 1 │ 1 │
│ 2 │ 22 │
└───┴─────────┘
items projectitems
┌───┬──────┐ ┌───┬─────────┬─────────┐
│id │ title│ │ id│ idItem │idProject│
├───┼──────┤ ├───┼─────────┼─────────┤
│10 │ show1│ │ 1 │ 10 │ 22 │
│11 │ show2│ │ 2 │ 11 │ 22 │
│12 │ show3│ │ 3 │ 12 │ 22 │
│13 │ show4│ │ 4 │ 10 │ 1 │
│14 │ show5│ │ 5 │ 11 │ 1 │
│15 │ show6│ │ 6 │ 12 │ 1 │
└───┴──────┘ └───┴─────────┴─────────┘
我试过这个:
SELECT
e.id, e.title, l.idProject
from
items as e
LEFT JOIN projectitems as l
on e.id = l.idItem
WHERE
e.title LIKE '%sho%' AND l.idProject = 22
ORDER BY
e.title ASC
我得到的结果是:
id title idProject
10 show1 22
11 show2 22
12 show3 22
我想要的结果:
id title idProject
10 show1 22
11 show2 22
12 show3 22
13 show4 (null)
14 show5 (null)
15 show6 (null)
此外,如果您知道实现此目的的不同方法,请告诉我。
谢谢。
只需将条件从 WHERE
子句移动到 ON
:
SELECT
e.id, e.title, l.idProject
from
items as e
LEFT JOIN projectitems as l
on e.id = l.idItem
and l.idProject = 22
WHERE
e.title LIKE '%sho%'
ORDER BY
e.title ASC
您必须将 l.idProject = 22
移动到 ON
子句:
SELECT
e.id, e.title, l.idProject
from
items as e
LEFT JOIN projectitems as l
on e.id = l.idItem AND l.idProject = 22
WHERE
e.title LIKE '%sho%'
ORDER BY
e.title ASC
将谓词放在 WHERE
子句中会将 LEFT JOIN
变成 INNER JOIN
。
我在 Android 中遇到 SQLite 问题:
从 items 我应该得到:
1) 标题字段包含字符串的所有项目。示例“%sho%”
2) 检查项目是否属于给定项目 (22)
project
┌───┬─────────┐
│ id│idProject│
├───┼─────────┤
│ 1 │ 1 │
│ 2 │ 22 │
└───┴─────────┘
items projectitems
┌───┬──────┐ ┌───┬─────────┬─────────┐
│id │ title│ │ id│ idItem │idProject│
├───┼──────┤ ├───┼─────────┼─────────┤
│10 │ show1│ │ 1 │ 10 │ 22 │
│11 │ show2│ │ 2 │ 11 │ 22 │
│12 │ show3│ │ 3 │ 12 │ 22 │
│13 │ show4│ │ 4 │ 10 │ 1 │
│14 │ show5│ │ 5 │ 11 │ 1 │
│15 │ show6│ │ 6 │ 12 │ 1 │
└───┴──────┘ └───┴─────────┴─────────┘
我试过这个:
SELECT
e.id, e.title, l.idProject
from
items as e
LEFT JOIN projectitems as l
on e.id = l.idItem
WHERE
e.title LIKE '%sho%' AND l.idProject = 22
ORDER BY
e.title ASC
我得到的结果是:
id title idProject
10 show1 22
11 show2 22
12 show3 22
我想要的结果:
id title idProject
10 show1 22
11 show2 22
12 show3 22
13 show4 (null)
14 show5 (null)
15 show6 (null)
此外,如果您知道实现此目的的不同方法,请告诉我。 谢谢。
只需将条件从 WHERE
子句移动到 ON
:
SELECT
e.id, e.title, l.idProject
from
items as e
LEFT JOIN projectitems as l
on e.id = l.idItem
and l.idProject = 22
WHERE
e.title LIKE '%sho%'
ORDER BY
e.title ASC
您必须将 l.idProject = 22
移动到 ON
子句:
SELECT
e.id, e.title, l.idProject
from
items as e
LEFT JOIN projectitems as l
on e.id = l.idItem AND l.idProject = 22
WHERE
e.title LIKE '%sho%'
ORDER BY
e.title ASC
将谓词放在 WHERE
子句中会将 LEFT JOIN
变成 INNER JOIN
。