SQL加入不同大小的表以及空值替换

时间:2016-10-19 14:57:19

标签: mysql sql sql-server

我正在研究数据表的查询,我似乎无法让它显示我想要的,我不知道这是否甚至可能在SQL中我想要做的是获取查询理想情况下响应一个布尔类型的额外列。

目前我可以运行两个查询,它们都运行完美,但我无法弄清楚如何将它们连接在一起下面是我的第一个查询的代码,这是返回啤酒,用户已经尝试过这很好并且正如预期的那样并按预期返回。

SELECT * 
FROM keg.beer 
JOIN keg.userbeer 
  ON beer.id = userbeer.beer_id 
WHERE userbeer.username_id = 1;

第二个查询更简单,只是选择获取啤酒列表。

SELECT * FROM keg.beer

我想要做的是运行一个查询并让它返回一个啤酒列表,如果用户已经尝试过,则返回一个布尔值。

2 个答案:

答案 0 :(得分:4)

你不会遇到太多无法使用简单的'ol SQL生成的“期望结果”的场景。在这种情况下,您将使用CASE语句来确定此人是否尝试过啤酒。您还需要LEFT OUTER JOIN,这样当您的已过滤的beer没有userid的{​​{1}}记录时,您就不会丢弃来自userbeer表格的记录}:

beer

正如@SeanLange在这里的注释中所提到的,对userid的WHERE语句的限制会导致在结果集中删除所需的记录,因此我们将 SELECT beer.name, beer.id, beer.country, CASE WHEN userbeer.username_id IS NULL THEN 0 ELSE 1 END AS user_tried_beer_boolean FROM keg.beer LEFT OUTER JOIN keg.userbeer ON beer.id = userbeer.beer_id AND userbeer.username_id = 1; 的限制移到{{ 1}} username_id = 1的一部分,以便{<1}}表格结果仅限于该用户 之前它已加入ON表格。

现在我需要喝一杯。

答案 1 :(得分:0)

SELECT  b.id,
        b.name,
        CASE WHEN u.username_id IS NOT NULL THEN TRUE ELSE FALSE END AS userdrankbeer
FROM keg.beer b
LEFT JOIN ( SELECT * FROM keg.userbeer WHERE username_id = 1 ) u
  ON beer.id = userbeer.beer_id