3种方式与子查询和多个where子句联接

汤米·格拉芬(Tommy Graffam)

我正在尝试解决一个问题,当我运行查询时,它会永远运行,而当我有3个where子句时不会执行,但是如果我只有2个where子句,它将执行得很好。

SELECT top(1) 
    INV.SUBINVENTORY_CODE, INV.LOCATOR_CODE, INV.ITEM_CODE, dp.DESCRIPTION, dp.barcode1, dp.barcode2, INV.QTY,  
    dp.FROM_SUB_INVENTORY_CODE, dp.FROM_LOCATOR_CODE, INV.SUBINVENTORY_CODE, Inv.INVENTORY_ITEM_ID, dp_hist.barcode1, 
    dp_hist.barcode2, dp_hist.DESCRIPTION,dp_hist.FROM_SUB_INVENTORY_CODE, dp_hist.FROM_LOCATOR_CODE 
FROM 
    INVENTORY AS INV FULL OUTER JOIN deliveries_picks_hist as dp_hist ON Inv.item_code = dp_hist.item_code 
FULL OUTER JOIN 
    deliveries_picks AS dp ON dp_hist.item_code = dp.ITEM_CODE 
WHERE 
    INV.LOCATOR_CODE = 'BMS.S.T.G' and 
    (inv.ITEM_CODE in 
    ((select TOP(1) ITEM_CODE from deliveries_picks_hist where  BARCODE1 = '" & barcode & "' or BARCODE2 = '" & barcode & "' or inv.ITEM_CODE = 'ASM.EN.CD'), 
    (select TOP(1) ITEM_CODE from deliveries_picks where BARCODE1 = '" & barcode & "' or BARCODE2 = '" & barcode & "' or inv.ITEM_CODE = 'ASM.EN.CD')))
group by 
    INV.INVENTORY_ITEM_ID, INV.LOCATOR_CODE, INV.ITEM_CODE, INV.QTY,  dp_hist.barcode1, dp_hist.barcode2, dp.DESCRIPTION, 
    dp.FROM_LOCATOR_CODE,  dp.FROM_SUB_INVENTORY_CODE, INV.SUBINVENTORY_CODE, DP.BARCODE1, DP.BARCODE2, dp_hist.DESCRIPTION,
    dp_hist.FROM_SUB_INVENTORY_CODE, dp_hist.FROM_LOCATOR_CODE 
order by 
    dp_hist.DESCRIPTION

当我添加时inv.ITEM_CODE = 'ASM.EN.CD',查询不起作用,但是如果我切换出一个内部联接并保持,inv.ITEM_CODE = 'ASM.EN.CD'则它也可以正常工作,我无法指出问题所在,我已重新格式化并尝试了几种不同的方法工作的方式,但不走运。

shawnt00

我相信您想要的就是我下面的内容。无论查询如何,您都希望将INV保持ITEM_CODE等于ASM.EN.CD的位置deliveries_picks*

OR通常会降低查询速度。但我认为造成这种情况变慢的原因很可能是因为在子查询中包含额外条件会导致更多的行匹配,因为它与外部表(INV相关联换句话说,当该额外条件为true时,子查询表中的所有行都将通过过滤器。优化器可能尚未制定出可以充分利用您只想查看“第一个”事实的计划。

请注意,在这些子查询中TOP使用时,您确实会遇到问题ORDER BY真的没有第一行没有第一行。顺便说一句,您对所有联接列的使用对我来说似乎都令人怀疑。如果您可以描述表之间的关系,则可能会得到更好的查询。最后,这些“条形码”条件可能更简单,@barcode in (BARCODE1, BARCODE2)因为您不必重复串联。

SELECT TOP 1 
    INV.SUBINVENTORY_CODE, INV.LOCATOR_CODE, INV.ITEM_CODE,
    dp.DESCRIPTION, dp.barcode1, dp.barcode2, INV.QTY,  
    dp.FROM_SUB_INVENTORY_CODE, dp.FROM_LOCATOR_CODE,
    INV.SUBINVENTORY_CODE, Inv.INVENTORY_ITEM_ID, dp_hist.barcode1, 
    dp_hist.barcode2, dp_hist.DESCRIPTION,
    dp_hist.FROM_SUB_INVENTORY_CODE, dp_hist.FROM_LOCATOR_CODE 
FROM 
    INVENTORY AS INV
    FULL OUTER JOIN deliveries_picks_hist AS dp_hist ON Inv.item_code = dp_hist.item_code 
    FULL OUTER JOIN deliveries_picks AS dp ON dp_hist.item_code = dp.ITEM_CODE 
WHERE 
    INV.LOCATOR_CODE = 'BMS.S.T.G'
    AND INV.ITEM_CODE in (
        (
            select TOP 1 ITEM_CODE from deliveries_picks_hist
            where BARCODE1 = '" & barcode & "' or BARCODE2 = '" & barcode & "'
        ),    
        (
            select TOP 1 ITEM_CODE from deliveries_picks
            where BARCODE1 = '" & barcode & "' or BARCODE2 = '" & barcode & "'
        ),
        'ASM.EN.CD'
    )
group by 
    INV.INVENTORY_ITEM_ID, INV.LOCATOR_CODE, INV.ITEM_CODE, INV.QTY,
    dp_hist.barcode1, dp_hist.barcode2, dp.DESCRIPTION, 
    dp.FROM_LOCATOR_CODE,  dp.FROM_SUB_INVENTORY_CODE,
    INV.SUBINVENTORY_CODE, DP.BARCODE1, DP.BARCODE2, dp_hist.DESCRIPTION,
    dp_hist.FROM_SUB_INVENTORY_CODE, dp_hist.FROM_LOCATOR_CODE 
order by 
    dp_hist.DESCRIPTION

如果CASE不起作用,使用应该可以“推迟”子查询的执行:

    AND
    CASE
        WHEN INV.ITEM_CODE = 'ASM.EN.CD' THEN 1
        WHEN INV.ITEM_CODE IN (
            (
                select TOP 1 ITEM_CODE from deliveries_picks_hist
                where BARCODE1 = '" & barcode & "' or BARCODE2 = '" & barcode & "'
            ),    
            (
                select TOP 1 ITEM_CODE from deliveries_picks
                where BARCODE1 = '" & barcode & "' or BARCODE2 = '" & barcode & "'
            )
        ) THEN 1
    END = 1

我的猜测是,这是您对联接逻辑的意图:

FROM 
    INVENTORY AS INV LEFT OUTER JOIN (
        deliveries_picks AS dp
        FULL OUTER JOIN
        deliveries_picks_hist AS dp_hist
            ON dp_hist.ITEM_CODE = dp.ITEM_CODE
    )
        ON INV.ITEM_CODE = COALESCE(dp.ITEM_CODE, dp_hist.ITEM_CODE)

通常,当您看到完全连接时,您还会看到很多COALESCE()操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

3种方式与子查询和多个where子句联接

来自分类Dev

Rails多个联接AR查询和where子句

来自分类Dev

Where子句和内部联接语法查询

来自分类Dev

SQL Server:如何提高WHERE子句中具有多个CTE和子查询的查询的性能

来自分类Dev

内部联接查询与内部联接..on和where子句查询之间的区别?

来自分类Dev

内部联接查询与内部联接..on和where子句查询之间的区别?

来自分类Dev

多个内部联接和子查询的查询优化

来自分类Dev

联接和子查询

来自分类Dev

存在子查询和WHERE子句中的OR导致UnknownError

来自分类Dev

对 JOIN 和 UNION 以及子查询使用相同的“WHERE”子句

来自分类Dev

INNER JOIN与mysql中的max和where子句的子查询

来自分类Dev

带有 In Case 和 Where 子句的子查询

来自分类Dev

在多个条件和子查询中使用LINQ左联接

来自分类Dev

子查询选择where子句

来自分类Dev

子查询选择where子句

来自分类Dev

SQL查询多个where子句

来自分类Dev

WHERE子句中的多个查询

来自分类Dev

mysql,多个表使用WHERE子句联接

来自分类Dev

Oracle SQL:在子查询中或在联接之后使用WHERE子句是否更有效?

来自分类Dev

mysql查询速度非常慢:左联接多个表,每个表的where子句

来自分类Dev

mysql查询速度非常慢:左联接多个表,每个表的where子句

来自分类Dev

在具有不同where子句的相同关系上进行多个联接/存在查询

来自分类Dev

SQLite选择,联接和where子句问题

来自分类Dev

子查询和联接的性能?

来自分类Dev

在 where 子句中使用自联接和 group bys 优化查询

来自分类Dev

Codeigniter 2.2-使用左联接和多个where子句更新Active Record

来自分类Dev

使用MS Access如何执行具有多个联接和where子句的更新?

来自分类Dev

使用MS Access如何执行具有多个联接和where子句的更新?

来自分类Dev

使用多个 where 子句选择多个查询

Related 相关文章

  1. 1

    3种方式与子查询和多个where子句联接

  2. 2

    Rails多个联接AR查询和where子句

  3. 3

    Where子句和内部联接语法查询

  4. 4

    SQL Server:如何提高WHERE子句中具有多个CTE和子查询的查询的性能

  5. 5

    内部联接查询与内部联接..on和where子句查询之间的区别?

  6. 6

    内部联接查询与内部联接..on和where子句查询之间的区别?

  7. 7

    多个内部联接和子查询的查询优化

  8. 8

    联接和子查询

  9. 9

    存在子查询和WHERE子句中的OR导致UnknownError

  10. 10

    对 JOIN 和 UNION 以及子查询使用相同的“WHERE”子句

  11. 11

    INNER JOIN与mysql中的max和where子句的子查询

  12. 12

    带有 In Case 和 Where 子句的子查询

  13. 13

    在多个条件和子查询中使用LINQ左联接

  14. 14

    子查询选择where子句

  15. 15

    子查询选择where子句

  16. 16

    SQL查询多个where子句

  17. 17

    WHERE子句中的多个查询

  18. 18

    mysql,多个表使用WHERE子句联接

  19. 19

    Oracle SQL:在子查询中或在联接之后使用WHERE子句是否更有效?

  20. 20

    mysql查询速度非常慢:左联接多个表,每个表的where子句

  21. 21

    mysql查询速度非常慢:左联接多个表,每个表的where子句

  22. 22

    在具有不同where子句的相同关系上进行多个联接/存在查询

  23. 23

    SQLite选择,联接和where子句问题

  24. 24

    子查询和联接的性能?

  25. 25

    在 where 子句中使用自联接和 group bys 优化查询

  26. 26

    Codeigniter 2.2-使用左联接和多个where子句更新Active Record

  27. 27

    使用MS Access如何执行具有多个联接和where子句的更新?

  28. 28

    使用MS Access如何执行具有多个联接和where子句的更新?

  29. 29

    使用多个 where 子句选择多个查询

热门标签

归档