【问题标题】:Where clause in pivot-structured table数据透视表中的 Where 子句
【发布时间】:2018-08-02 02:28:50
【问题描述】:

我在 DB2(oracle 语法)中有一个如下所示的表,我们称之为 SAMPLE

ID    TAG_NAME    VALUE
13    10          77
13    11          80
14    10          92
14    11          83

我想要做的是选择 TAG_NAME 10 具有 VALUE 77 且 TAG_NAME 11 具有 VALUE 80 的所有行。我该怎么做?如果我喜欢下面,它将尝试创建 TAG_NAME 必须同时为 10 和 11,而 VALUE 必须同时为 77 和 80 的情况。我不想选择这些特定的标签名称,而是当标签name 是 x 然后它应该检查值是 y 等等。

SELECT 
    * 
FROM 
    SAMPLE
WHERE
    (TAG_NAME=10 AND VALUE=77)
    AND (TAG_NAME=11 AND VALUE=80)

我想要达到的结果是这样的:

ID    TAG_NAME    VALUE
13    10          77
13    11          80

【问题讨论】:

标签: sql database oracle db2 ibm-cloud


【解决方案1】:

您可以使用group byhaving

SELECT s.id
FROM SAMPLE s
WHERE (TAG_NAME = 10 AND VALUE = 77) OR
      (TAG_NAME = 11 AND VALUE = 80)
GROUP BY s.id
HAVING COUNT(DISTINCT TAG_NAME) = 2;

【讨论】:

    【解决方案2】:

    我不知道 DB2,但在 Oracle 中你可以这样做:

    select *
    from   demo
    where  (tag_name, value) in ((10,77), (11,80));
    

    【讨论】:

      【解决方案3】:

      我认为你在说:

      时解决了你自己的问题:

      如果我喜欢下面的内容,它将尝试创建一种情况,即 TAG_NAME 必须同时为 10 和 11,而 VALUE 必须同时为 77 和 80

      如果您将其更改为 OR,它应该可以工作。

      SELECT 
          * .
      FROM 
          SAMPLE
      WHERE
          (TAG_NAME=10 AND VALUE=77)
          OR (TAG_NAME=11 AND VALUE=80)
          OR (TAG_NAME=x AND VALUE=y)
      

      【讨论】:

        猜你喜欢
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 2019-02-03
        • 2011-02-18
        相关资源
        最近更新 更多