【问题标题】:SQL: Joining data from table with multiple conditions where value matchesSQL:将表中的数据与值匹配的多个条件连接起来
【发布时间】:2019-12-18 05:38:39
【问题描述】:

Table1 包含 POS、ID、NAME、TYPE 列 我一直在运行标准查询;

SELECT POS, NAME FROM Table1 WHERE ID = 100 AND TYPE LIKE '%someType%' ORDER BY POS ASC

Table2 包含 POS、ID、VALUE、ROLE 列

SELECT POS, VALUE FROM Table2 WHERE IS = 100 AND ROLE LIKE '%someType%' ORDER BY POS ASC

我想将这两者结合起来以返回具有 3 列的记录集; POS、Table1.NAME 和 Table2.VALUE...无论我尝试使用内部联接做什么,我都会得到比我应该得到的更多的行。另外,如果 Table 中的相应值不存在,我希望它返回 null 或其他内容,以便记录集本质上看起来像这样;

POS    NAME    VALUE
1      A       DF1
2      B       DF1
3      C       DF2
4      C       null
5      null    DF3
etc...

这可能吗?

【问题讨论】:

  • 如果两个查询之一返回多于一行,你想如何处理?
  • 我觉得如果返回多行就好了;也许我可以按附加标准对它们进行排序。所以位置 1 可能有 2 或 3 行(我根据位置值在脚本中使用这些值)。
  • 向我们展示您尝试过的组合查询。

标签: sql oracle


【解决方案1】:

您似乎正在寻找一个简单的联接。比如:

select t1.pos, t1.name, t2.value
from table1 t1
inner join table2 t2 
    on  t2.pos = t1.pos 
    and t2.is = t1.id
    and t2.role like '%someType%'
where
    t1.type like '%someType%'
    and t1.id = 100
order by t1.pos

请注意,如果您的一个或两个原始查询返回多于一行,您将在结果集中获得这些的笛卡尔积。

或者如果你想允许来自两个表的行,即使另一个表中没有匹配,那么你可以full outer join两个查询,比如:

select coalesce(t1.pos, t2.pos) pos, t1.name, t2.value
from (
    select pos, name from table1 where id = 100 and type like '%someType%'
) t1
full outer join (
    select pos, value from table2 where is = 100 and role like '%someType%'
) t2
on t1.pos = t2.pos
order by coalesce(t1.pos, t2.pos)

【讨论】:

  • 因此,如果它返回多行,我会将它们作为单独的行来处理,但如果 Table1 或 Table2 中的匹配值丢失,它不会返回该行...我希望它返回 4 - C - null (或类似的东西),这样即使值不存在,我仍然可以访问 Name 值(反之亦然)......
  • @trishia42:这听起来像是一个完整的外部连接。我更新了我的答案。
  • 效果非常好!但是,如果您不介意,我还有最后一个问题;对于您的第一个答案,如果给定位置的行数超过一行,则可以在 ORDER 子句中添加“,t1.ID”,以便使用 table1 中的附加列对它们进行排序;有什么方法可以将相同的内容添加到第二个答案 - 将其添加到 order 子句不会返回任何内容。
  • @trishia42:order by 子句不会过滤掉记录...我认为您想要order by coalesce(t1.id, t2.id),或者可能需要order by t1.id, t2.id)
  • @trishia42:我只能回答你最初提出的问题。如果您认为我的回答解决了您的问题,请accept it。如果您还有其他问题,那么您可能想要创建一个新问题,提供能够真正说明您的问题的示例数据和预期结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2021-06-13
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
相关资源
最近更新 更多