SQL Developer和OR语句

时间:2016-02-26 08:07:07

标签: sql oracle statements

我的工作中有一项任务是使用SQL Developer将不同表中的多个字段放到一个工作表中。我是一个SQL的菜鸟,但设法建立一些东西。看看我的输出告诉我,我内置的限制不起作用。简短说明如下。有人可以帮帮我吗?!在我的输出中,我仍然在ATINN字段中看到1006以外的值,其他值在BWTAR字段中为空。我做错了什么?

  1. 5个表链接在一起

  2. 对用户的限制(DMSTRAATL等)

  3. 对产品组的限制(006 *等)

  4. 对某些产品的限制

  5. 对产品类型的限制(HERB等)

  6. 对特定数据字段的限制(所有产品的atinn = 1006)

  7. 特定数据字段的重新排列(所有产品应该有bwtar =空)

  8. SELECT 
        dmssap.mara.matnr, dmssap.mara.mtart, dmssap.mara.matkl, 
        dmssap.mara.ersda, dmssap.mara.ernam, dmssap.mara.bismt, 
        dmssap.marc.werks, dmssap.inob.cuobj, 
        LPAD(INOB.CUOBJ, 18, '0') AS CUOBJ_18, dmssap.ZMM_MATNR_MPO.matnr, dmssap.ZMM_MATNR_MPO.pname, 
        dmssap.ZMM_MATNR_MPO.stat, dmssap.mbew.bwkey, dmssap.mbew.bklas, 
        dmssap.mbew.bwtar, dmssap.mbew.vprsv, dmssap.mbew.bwtty, dmssap.mbew.verpr,
        dmssap.mbew.stprs, dmssap.ZMM_MATNR_MPO.matnr, dmssap.ZMM_MATNR_MPO.pname, 
        dmssap.ZMM_MATNR_MPO.stat, dmssap.ausp.atinn, dmssap.ausp.atwrt
    FROM dmssap.mara
    LEFT OUTER JOIN dmssap.marc
        ON (dmssap.marc.matnr) = (dmssap.mara.matnr) 
    LEFT OUTER JOIN dmssap.ZMM_MATNR_MPO
        ON (dmssap.ZMM_MATNR_MPO.matnr) = (dmssap.mara.matnr)
    LEFT OUTER JOIN dmssap.mbew
        ON CONCAT(dmssap.mbew.matnr, dmssap.mbew.bwkey) = CONCAT(dmssap.marc.matnr, dmssap.marc.werks)
    LEFT OUTER JOIN dmssap.inob
        ON (dmssap.inob.objek) = (dmssap.mara.matnr)
    LEFT OUTER JOIN dmssap.ausp
        ON dmssap.ausp.objek = LPAD(INOB.CUOBJ, 18, '0')
    WHERE (dmssap.mara.ernam) IN (
        'DMSTRAATL', 'V0342628', 'V0343809', 
        'V0336003', 'V0009830', 'V0309577', 'V0010144'
    )
    AND (dmssap.mara.matkl) IN (
        '006*', '007120',    '007130',    '007140',    '007170',    
        '007180',    '007210',    '007220',    '007230',    
        '007250',    '007270',    '007280',    '007290',    
        '007300',    '007320',    '007340',    
        '007370',    '007380',    '007400',    '007420'
    )
    OR (dmssap.mara.matnr) IN (
        '000000010001767697',     '000000010001870117',     '000000010001870116',     '000000010001870115',    
        '000000010001870114',     '000000010001870113',     '000000010001870112'
    )
    AND (dmssap.mara.mtart) IN ('HERB', 'HALB', 'ZSTP')
    AND (dmssap.ausp.atinn) = '1006'
    AND (dmssap.mbew.bwtar) IS NULL;
    

2 个答案:

答案 0 :(得分:1)

AND 运算符的优先顺序高于 OR 。使查询易于阅读使用围绕过滤子句的大括号()。

假设您要选择dmssap.mara.matkl中具有特定值的记录或dmssap.mara.matnr中的某些值,则可以使用这些块之间的大括号进行精确处理,如下所示。

AND (
(dmssap.mara.matkl) IN (
    '006*', '007120',    '007130',    '007140',    '007170',    
    '007180',    '007210',    '007220',    '007230',    
    '007250',    '007270',    '007280',    '007290',    
    '007300',    '007320',    '007340',    
    '007370',    '007380',    '007400',    '007420'
)
OR (dmssap.mara.matnr) IN (
    '000000010001767697',     '000000010001870117',     '000000010001870116',     '000000010001870115',    
    '000000010001870114',     '000000010001870113',     '000000010001870112'
)
)

答案 1 :(得分:0)

WHERE (dmssap.mara.ernam) IN (
    'DMSTRAATL', 'V0342628', 'V0343809', 
    'V0336003', 'V0009830', 'V0309577', 'V0010144'
)
AND (dmssap.mara.matkl) IN (
    '006*', '007120',    '007130',    '007140',    '007170',    
    '007180',    '007210',    '007220',    '007230',    
    '007250',    '007270',    '007280',    '007290',    
    '007300',    '007320',    '007340',    
    '007370',    '007380',    '007400',    '007420'
)
OR (dmssap.mara.matnr) IN (
    '000000010001767697',     '000000010001870117',     '000000010001870116',     '000000010001870115',    
    '000000010001870114',     '000000010001870113',     '000000010001870112'
)
AND (dmssap.mara.mtart) IN ('HERB', 'HALB', 'ZSTP')
AND (dmssap.ausp.atinn) = '1006'
AND (dmssap.mbew.bwtar) IS NULL;

症结在你的WHERE陈述中。 WHERE语句中关键字的评估顺序为NOT - > AND - > OR

你似乎想要的是这个:

WHERE (dmssap.mara.ernam) IN (
    'DMSTRAATL', 'V0342628', 'V0343809', 
    'V0336003', 'V0009830', 'V0309577', 'V0010144'
)
AND (dmssap.mara.matkl) IN ((
    '006*', '007120',    '007130',    '007140',    '007170',    
    '007180',    '007210',    '007220',    '007230',    
    '007250',    '007270',    '007280',    '007290',    
    '007300',    '007320',    '007340',    
    '007370',    '007380',    '007400',    '007420'
)
OR (dmssap.mara.matnr) IN (
    '000000010001767697',     '000000010001870117',     '000000010001870116',     '000000010001870115',    
    '000000010001870114',     '000000010001870113',     '000000010001870112'
))
AND (dmssap.mara.mtart) IN ('HERB', 'HALB', 'ZSTP')
AND (dmssap.ausp.atinn) = '1006'
AND (dmssap.mbew.bwtar) IS NULL;

注意AND

上OR的两个额外括号