在左连接中,选择值为A的行,如果不是,则选择值为B的行

时间:2015-05-04 15:33:04

标签: sql join sqlite

这一定很简单,但我想我已经迷失了。我有一张桌子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"。

3 个答案:

答案 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
                  )

小提琴http://sqlfiddle.com/#!7/0b7db/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