【问题标题】:In a left join, select row with value A, if not select row with value B在左连接中,选择值为 A 的行,如果不选择值为 B 的行
【发布时间】:2015-05-04 15:33:04
【问题描述】:

这一定很简单,但我想我迷路了。我有一张桌子 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),或者如果首选昵称不可用,如何获取任何其他昵称。

所以汤姆的结果是“蝙蝠侠”,而芭芭拉的结果是“飞天小女警”。

【问题讨论】:

  • 汤姆的结果会是“蝙蝠侠”吗?你打算如何展示它?你试过什么?
  • 维克兰特,我会使用这样的连接:从表 A 中选择昵称左连接表 B 在 A.id = B.id where A.name = "Tom"; --- 但这会给我“蜘蛛侠”和“蝙蝠侠”
  • 一个人可以有多个首选昵称吗?不止一个昵称呢?
  • 谢谢约翰。只有一个首选,可能多个非首选。在后一种情况下,我想显示所有非首选。

标签: sql join sqlite


【解决方案1】:

立即解决:

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

【讨论】:

  • 我选择 Vikrant 的答案作为描述的一般问题的最佳答案,但实际上对于我的具体情况(我在最初的问题中没有详细说明)你的回答效果更好不依赖“max”函数。感谢您的帮助 - 这是一个赞成票。
【解决方案2】:

试试下面的查询:

哪个 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

【讨论】:

  • 我描述的问题的最佳解决方案。由于我的描述与我的实际问题之间存在差异,我不得不使用 Giorgi 的解决方案,但您的回复仍需要选择为“那个”。谢谢:)
  • 谢谢!很高兴为您提供帮助! @灰尘。 ;)
【解决方案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

【讨论】:

  • 是的,它也是一个工作,解释sqlite
  • 感谢您的帮助——另一个很好的答案,我赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2013-11-07
  • 2015-07-04
相关资源
最近更新 更多