这一定很简单,但我想我已经迷失了。我有一张桌子A:
name id
Tom 1
Barbara 2
Gregory 3
...和表B:
id nickname preferred
1 Spiderman 0
1 Batman 1
2 Powerpuff 0
3 Donald Duck 0
3 Hulk 1
如何在首选(1)时查询表以获取昵称,或者如果首选昵称不可用,则如何查询昵称。
所以Tom的结果将是" Batman",而Barbara的结果将是" Powerpuff"。
答案 0 :(得分:4)
立即解决方案:
select a.id,
b.nickname
from a
join b on a.id = b.id and b.prefered = 1
union all
select a.id,
b.nickname
from a
join b on a.id = b.id and b.prefered = 0
where a.id not in(
select a.id
from a
join b on a.id = b.id and b.prefered = 1
)
答案 1 :(得分:3)
如果SQLite支持分析功能,那么这将提供一个相当干净和方便的解决方案。但是没有这样的运气。它确实简化了您希望给定人员(其中最多只有一个)或所有非首选昵称的所有首选昵称的问题。然后,使用内联视图来区分这些情况并应用合适的过滤器非常简单:
SELECT p.name, pn.nickname
FROM
person p
JOIN (
SELECT id, MAX(preferred) AS preferred
FROM person_nickname
GROUP BY id
) flag
ON p.id = flag.id
JOIN person_nickname pn
ON pn.id = flag.id AND pn.preferred = flag.preferred
答案 2 :(得分:3)
尝试以下查询:
其中1.选择值为A的行,否则为2.选择值为B的行 使用 LEFT JOIN ,
SELECT A.name, B.nickname
FROM A
LEFT JOIN
(
SELECT MAX(preferred) AS preferred, id
FROM B
GROUP BY id
)AS B1
ON A.id = B1.id
LEFT JOIN B ON B.preferred = B1.preferred AND B.id = B1.id