【问题标题】:Only output specific Values using SQL仅使用 SQL 输出特定值
【发布时间】:2021-11-26 03:11:25
【问题描述】:

如果我想从 table1 中带回所有“名称”并且仅在第 2 列中列出输出以包含值(如果它是“Apple”),我正在尝试计算 SQL 的方式。如果它不是“Apple”或者是“Null”,那么第 2 列也应该是“Null”

表 1

ID(pk) Name
24 Boris
25 Dominic
26 Rishi
27 Elizabeth
28 Ben

表 2

ID(fk) Description
27 Apple
27 Orange
27 Pear
26 Apple
26 Pear
25 Pear
24 Orange

需要的输出

Name Description
Boris
Dominic
Rishi Apple
Elizabeth Apple
Sajid

【问题讨论】:

  • 第二个表可以有重复行吗?例如,可以有多行具有相同的 (27, 'Apple') 值吗?
  • 嗨。谢谢你的评论。答案是不'。每个 ID 只有一种水果。

标签: sql oracle


【解决方案1】:

如果第二个表中没有重复项(在您确认是这种情况的问题下方的评论中),这是外连接的简单应用。

这里我将测试数据包含在with 子句中。你不需要它 - 你有实际的桌子。删除with 子句,检查主查询并根据需要更改表名和列名。

with
  table_1 (id, name) as (
    select 24, 'Boris'     from dual union all
    select 25, 'Dominic'   from dual union all
    select 26, 'Rishi'     from dual union all
    select 27, 'Elizabeth' from dual union all
    select 28, 'Ben'       from dual
  )
, table_2 (id, description) as (
    select 27, 'Apple'  from dual union all
    select 27, 'Orange' from dual union all
    select 27, 'Pear'   from dual union all
    select 26, 'Apple'  from dual union all
    select 26, 'Pear'   from dual union all
    select 25, 'Pear'   from dual union all
    select 24, 'Orange' from dual
  )
select t1.name, t2.description
from   table_1 t1 left outer join table_2 t2 
                  on t2.id = t1.id and t2.description = 'Apple'
order  by t1.id
;


NAME      DESCRIPTION
--------- -----------
Boris           
Dominic         
Rishi     Apple 
Elizabeth Apple 
Ben 

【讨论】:

  • 嗨 - 非常感谢这个工作!这非常令人沮丧,因为我之前曾尝试过此操作,但已将“t2.description = 'Apple'”位放在 where 子句中。我对此很陌生,所以我需要离开并了解为什么它根据您的解决方案工作不同。非常感谢您帮助我。
【解决方案2】:

你可以通过多种方式解决它,一个例子:

SELECT t1.name
     , MAX(CASE t2.descripton WHEN 'Apple' THEN t2.descripton END)
FROM t1
JOIN t2
    USING(id)
GROUP BY t1.name;

CASE 表达式会将除 Apple 之外的所有内容都映射为 null。然后,MAX 会将每个名称的集合减少为 Apple 或 null。

【讨论】:

  • 这将为伊丽莎白输出三行,而不仅仅是一行。
  • 啊,对不起。我忽略了这一点。如果问题中有一些有用的东西可以测试,那就容易多了。我会修改我的答案
  • 嗨 - 感谢您抽出时间提供帮助。该语句不会像上面给出的 USING(id) 那样工作,但是一旦 id 将正确的语法放入并添加了一个外连接就可以工作。
  • 这是标准 SQL,但如果您的 DBMS 不支持,您可以将其替换为 ON t1.id=t2.id
【解决方案3】:

我认为下面的查询对你有用:

Select Name, CASE WHEN ID IN (SELECT DISTINCT ID FROM table2 WHERE LOWER(description) = 'apple') THEN 'Apple' ELSE Null END as Description FROM table1;

【讨论】:

  • 它对你有用吗?
  • 今天我已经离开办公室了。明天早上我可以先检查一下,然后告诉你。谢谢。
  • 当然,不用担心
  • 嗨 - 感谢您提供我测试和工作的解决方案。唯一的问题是它的运行速度比提供的其他解决方案慢一点。感谢您抽出时间提供帮助:)
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
相关资源
最近更新 更多