【问题标题】:How to join tables in Oracle if I have a string with substrings in one table如果我在一个表中有一个带有子字符串的字符串,如何在 Oracle 中连接表
【发布时间】:2020-08-28 15:57:34
【问题描述】:

我有三个结构复杂的表。我这样查询他们:

select sart.season, ost.art, ost.asize, sum(ost.kol) as sum_kol, gr.shopid
from firm.e_osttek_online ost
inner join firm.s_art sart on ost.art = sart.art
join firm.tdm_map_new_shop_group gr on 
(ost.id_shop = gr.shopid and
gr.season_out = case when gr.season_out != ' ' then sart.season end
)
where gr.s_group = '89901'
group by sart.season, gr.shopid, ost.art, ost.asize having sum(ost.kol) > 0 
order by ost.art, ost.asize;

gr.season_out 可以包含空格。这意味着如果有空格,请不要按照我在案例中指定的第二个条件使用连接。它运作良好。现在表 gr 改变了。唯一的变化是 season_out 字段可能包含一个季节或一个空格或由逗号分隔的几个季节的字符串(之前它是一个季节或只有一个空格)。 sart.season 只能包含一个季节并且不能包含空格。现在如何重写join,保留空间逻辑(很关键)?我知道结构很糟糕,我不应该在一个 gr 领域里放几个赛季,但我没有权力控制它,这不是我的设计。我只需要查询。

gr:
          SEASON                    S_GROUP           SHOPID  
|--------------------------|----------------------------|-------|
|         Winter           |        DescriptionW        |   A   |
|--------------------------|----------------------------|-------|
|    Winter, Allweather    |        Description2        |   B   |
|--------------------------|----------------------------|-------|
|                          |        DescriptionS        |   C   |
|--------------------------|----------------------------|-------|

sart:
          SEASON                    SOMETHINGELSE              ART
|--------------------------|----------------------------|---------------|
|         Winter           |        SomethingElseW      |       1       |
|--------------------------|----------------------------|---------------|
|         Allweather       |        SomethingElseA      |       2       |
|--------------------------|----------------------------|---------------|
|            Fall          |        SomethingElseF      |       3       |
|--------------------------|----------------------------|---------------|

ost:
          ART                         ASIZE                     ID_SHOP     KOL
|--------------------------|----------------------------|------------------|----|
|         1                |        Stuff1              |          A       | 0  |
|--------------------------|----------------------------|------------------|----|
|         2                |        Stuff2              |          B       | 20 |
|--------------------------|----------------------------|------------------|----|
|         3                |        Stuff3              |          C       | 30 |
|--------------------------|----------------------------|------------------|----|

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • 只是想显示更真实的查询,因为该线程中的“LIKE”是一个很好的答案,但不考虑空格。没有 soaces 会更容易,但我必须注意它们
  • 我在这里添加了结构更好的名称

标签: sql database oracle join oracle11g


【解决方案1】:

实现这一点的一种方法(如果你真的不能干扰模型和插入的数据)是使用INSTR SQL 函数: https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_1103.htm#OLADM564

如果INSTR 返回非零值,则找到搜索的字符串。在这种情况下,如果 INSTR 返回一个非零值,那么该值在“复合键”中匹配,因此即使您有空格和/或逗号。

查询应该是这样的:

select sart.season, ost.art, ost.asize, sum(ost.kol) as sum_kol, gr.shopid
from firm.e_osttek_online ost
inner join firm.s_art sart on ost.art = sart.art
join firm.tdm_map_new_shop_group gr on 
(ost.id_shop = gr.shopid
and INSTR(gr.season_out, sart.season) <> 0
)
where gr.s_group = '89901'
group by sart.season, gr.shopid, ost.art, ost.asize having sum(ost.kol) > 0 
order by ost.art, ost.asize;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2021-02-20
    • 2015-05-13
    相关资源
    最近更新 更多