当前位置: 首页 > 知识库问答 >
问题:

左接合(a,b,c)--非常奇怪的行为

王刚毅
2023-03-14
SELECT count(*) FROM main_table
LEFT JOIN front_table ON front_table.pk = main_table.fk_front_table
LEFT JOIN info_table ON info_table.pk = front_table.fk_info_table
LEFT JOIN key_table ON key_table.pk = COALESCE(info_table.fk_key_table, front_table.fk_key_table_1, front_table.fk_key_table_2)
LEFT JOIN side_table ON side_table.fk_front_table = front_table.pk
WHERE side_table.pk = (SELECT MAX(pk) FROM side_table WHERE fk_front_table = front_table.pk)
OR side_table.pk IS NULL

在这个查询中,我从来没有得到side_table.pk的空值。如果删除coalesce或不使用key_table,则查询返回具有许多null side_table.pk的行,但如果添加coalesce join,则无法获得这些null。

似乎key_table和side_table没有任何共同之处,但结果非常奇怪。

另外,当我不使用side_table和WHERE子句时,count(*)的结果与coalesce和white不一样,但是我看不到行中缺少任何模式,这似乎是随机的!

SELECT ECHANGE.EXC_AUTO_KEY, STOCK_RESERVATIONS.STR_AUTO_KEY FROM EXCHANGE
LEFT JOIN WO_BOM ON WO_BOM.WOB_AUTO_KEY = EXCHANGE.WOB_AUTO_KEY
LEFT JOIN VIEW_WO_SUB ON VIEW_WO_SUB.WOO_AUTO_KEY = WO_BOM.WOO_AUTO_KEY
LEFT JOIN STOCK stock3 ON stock3.STM_AUTO_KEY = EXCHANGE.STM_AUTO_KEY
LEFT JOIN STOCK stock2 ON stock2.STM_AUTO_KEY = EXCHANGE.ORIG_STM
LEFT JOIN CONSIGNMENT_CODES con2 ON con2.CNC_AUTO_KEY = stock2.CNC_AUTO_KEY
LEFT JOIN CONSIGNMENT_CODES con3 ON con3.CNC_AUTO_KEY = stock3.CNC_AUTO_KEY
LEFT JOIN CI_UTL ON CI_UTL.CUT_AUTO_KEY = EXCHANGE.CUT_AUTO_KEY
LEFT JOIN PART_CONDITION_CODES pcc2 ON pcc2.PCC_AUTO_KEY = stock2.PCC_AUTO_KEY
LEFT JOIN PART_CONDITION_CODES pcc3 ON pcc3.PCC_AUTO_KEY = stock3.PCC_AUTO_KEY
LEFT JOIN STOCK_RESERVATIONS ON STOCK_RESERVATIONS.STM_AUTO_KEY = stock3.STM_AUTO_KEY
LEFT JOIN WAREHOUSE wh2 ON wh2.WHS_AUTO_KEY = stock2.WHS_ORIGINAL
LEFT JOIN SM_HISTORY ON (SM_HISTORY.STM_AUTO_KEY = EXCHANGE.ORIG_STM AND SM_HISTORY.WOB_REF = EXCHANGE.WOB_AUTO_KEY)
LEFT JOIN RC_DETAIL ON stock3.RCD_AUTO_KEY = RC_DETAIL.RCD_AUTO_KEY
LEFT JOIN RC_HEADER ON RC_HEADER.RCH_AUTO_KEY = RC_DETAIL.RCH_AUTO_KEY
LEFT JOIN WAREHOUSE wh3 ON wh3.WHS_AUTO_KEY = COALESCE(RC_DETAIL.WHS_AUTO_KEY, stock3.WHS_ORIGINAL, stock3.WHS_AUTO_KEY)
WHERE STOCK_RESERVATIONS.STR_AUTO_KEY = (SELECT MAX(STR_AUTO_KEY) FROM STOCK_RESERVATIONS WHERE STM_AUTO_KEY = stock3.STM_AUTO_KEY)
OR STOCK_RESERVATIONS.STR_AUTO_KEY IS NULL

我用相同结构的数字重新创建了简单的表,查询工作没有任何问题。0

共有1个答案

石正卿
2023-03-14

我有一种感觉,coalesce充当了联接表的required标志,因此将left join转换为inner join

试试这个:

SELECT COUNT(*) 
FROM main_table
  LEFT JOIN front_table ON front_table.pk = main_table.fk_front_table
  LEFT JOIN info_table ON info_table.pk = front_table.fk_info_table
  LEFT JOIN key_table ON key_table.pk = NVL(info_table.fk_key_table, NVL(front_table.fk_key_table_1, front_table.fk_key_table_2))
  LEFT JOIN (SELECT fk_, MAX(pk) as pk FROM side_table GROUP BY fk_) st ON st.fk_ = front_table.pk

NVL的行为可能与此相同...

 类似资料:
  • 好的,最近我在寻找一种在PowerShell中实现空合并的方法,我遇到了这篇文章:在PowerShells中实现空聚合。 我看到了@Zenexer的评论,很感兴趣。语法如下: 这非常有效。然而,我的一位同事(沃尔特·帕克特)和我非常感兴趣,对语法做了更多的挖掘,发现了一些真正的奇怪之处。 在我进入怪异之前,任何人都可以指出任何解释这种语法的文档吗? 经验教训: < li >测试应该进入数组的最后一

  • 本文向大家介绍查找(a ^ b)%m,其中“ a”在C ++中非常大,包括了查找(a ^ b)%m,其中“ a”在C ++中非常大的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将求解方程(a b)%m,其中a是一个非常大的数字。 公式(a b)%m =(a%m)*(a%m)... b_times。我们可以通过找到a%m的值然后将其乘以b来解决该问题。 让我们看看解决问题的步骤。 初始化

  • 问题内容: 伙计们,在我的应用程序中,为了测量帧之间的增量时间(gamedev中的一种典型方法),我不时遇到一种奇怪的行为-返回值有时不是单调的(即上次时间) 是更大的 比目前的时间)。 当前,如果发生这样的悖论,我只是跳过当前帧并开始处理下一个帧。 问题是,这怎么可能呢?这是Linux POSIX实现中的错误吗?我正在使用Ubuntu Server Edition 10.04(内核2.6.32-

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 将< code>dplyr::arrange与< code>gtools::mixedorder一起使用时,我注意到了一个意外的结果。 考虑: 在test2中,第1列排序: 而在test3中,列的排序与使用gtools:mixedorder时预期的一样 为什么当我组合排列和混合工具时会发生这种情况?这是一个错误吗? 非常感谢,安妮克

  • 这个程序打印00,但是如果我注释掉a.store和b.store,而取消注释a.fetch_add和b.fetch_add,这做了完全相同的事情,即都设置了a=1,b=1的值,我永远不会得到00。 是我错过了什么,还是“00”按标准永远不会出现? 下面打印00。 下图从不打印00 再看看这个,多线程原子a b打印00 for memory_order_refield