【问题标题】:Selecting rows based on multiple WHERE conditions根据多个 WHERE 条件选择行
【发布时间】:2016-07-08 16:41:25
【问题描述】:

我想从表PROD 中收集有关包含特定三元组值的行的所有详细信息。例如,我想获取具有列 (IDNBR AND COP_I) 的行上的所有数据,其值为 (23534, 99, 0232) 和 (3423,5,09384) 等。我试过了版本 1,但是当我知道需要有 100 行并且版本 2 遇到错误时,它只给了我几个这样的行。我想不出任何其他方法来做到这一点。

版本 1:

SELECT * FROM PROD

WHERE 

ID IN (2534, 3423) 

AND NBR IN (99, 5)

AND COP_I IN (0232, 09384)  

版本 2:

SELECT * FROM PROD

WHERE 

    (ID = '23534',  NBR ='99',  COP_I ='0232'),
AND (ID = '3423',   NBR ='5',   COP_I ='09384')

更新

我目前得到类似的东西:

ID     NBR_IN   COP_I  FLAG  TYPE     DATE 
23534  99       0232   0     CATHAY   15-04-2017

并且不要最终得到 (3423, 5, 09384) 三元组的行。基本上,只有一些三元组的行出现在结果中,结果与我从上面的版本 1 中得到的结果相同。

谢谢

【问题讨论】:

    标签: sql toad


    【解决方案1】:

    我认为你应该使用OR 条件。

    SELECT * FROM PROD
    WHERE (ID = '23534' AND  NBR ='99' AND COP_I ='0232')
    OR (ID = '3423' AND NBR ='5' AND COP_I ='09384')
    

    【讨论】:

    • 我得到的结果似乎与我在问题中使用“版本 1”时得到的结果相同。您知道为什么此查询不起作用吗?
    • 一些样本数据和预期结果会有所帮助。
    • 我添加了一些示例数据并进一步解释了我的预期结果。
    【解决方案2】:

    您的第二个查询是正确的,只是您需要将AND 替换为OR,将,s 替换为ANDs。

    SELECT * 
    FROM PROD
    WHERE 
        (ID = '23534' AND NBR ='99' AND COP_I = '0232')
    OR 
        (ID = '3423' AND  NBR ='5' AND COP_I = '09384')
    

    【讨论】:

    • 我遇到了一个最奇怪的问题,其中很多对应于特定三元组的行没有显示出来。你能想到为什么会这样吗?
    • @Jojo 你确定数据是你认为的那样吗?
    • 对不起,我不太清楚你这个问题的意思。
    • @Jojo 我在问表是否实际上包含与查询匹配的数据。查看您问题中的更新,为什么您希望查找 ID 3423 的查询返回 ID 为 2534 的行?
    • 对不起,这是我复制时的错误。我已经更新了这个。
    【解决方案3】:

    你可以像这样指定三元组:

    SELECT * FROM PROD 
    WHERE ( id, nbr, cop_i ) IN ( ('23534','99','0232'), ('3423','5','09384') );
    

    【讨论】:

    • 谢谢,但这个答案似乎抛出了一个错误。
    • 嗯。我在 Oracle 中尝试过,效果很好。您使用的是什么 RDBMS?
    【解决方案4】:

    您可以使用如下查询:

    SELECT p.* 
    FROM PROD AS p
    INNER JOIN (
       SELECT 23534 AS col1, 99 AS col2, 232 AS col3 UNION ALL
       SELECT 3423,          5,          9384
    ) AS t ON p.ID = t.col1 AND p.NBR = t.col2 AND p.COP_I = t.col3
    

    【讨论】:

      【解决方案5】:

      根据您可能需要使用多少对值以及您的 RDBMS,您可以执行以下操作:

      create table #tempThingy (ID int, NBR int, COP_I int)
      
      insert into #tempThingy (id, nbr, cop_i) 
      select 23534, 99, 0232
      union all select 3423, 5, 09384
      
      select   *
      from prod p
      inner join #tempThingy t on p.id = t.id
          and p.nbr = t.nbr
          and p.cop_i = t.cop_i
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-23
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-01
        • 2012-06-02
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多