0

我有点脑筋急转弯,我什至不知道如何表达这个问题,所以我将举个例子......

我有一个表 table_a,它有一些行数,我需要基于 2 列进行选择。基本上,如果 A 和 B 为真,我想选择一行。但是,如果 B 不为真,我需要选择 A 为真且 B 为另一个值的行。

所以给定一张这样的桌子......

Col A    ColB
1        'X'
1        'Y'
2        'Z'

我想说一些类似...

给我 ColA='1' 和 ColB='X' 的所有行。如果不存在,请给我 ColA='1' 和 ColB='Y' 的行。但如果 (1,X) 存在,我不想要 (1,Y) 。

哎呀。我怎样才能有效地做到这一点?

4

4 回答 4

1

我想使用这个查询:

SELECT *
FROM yourtable
WHERE
  (ColA, ColB) = (SELECT ColA, ColB FROM yourtable WHERE (ColA, ColB)=(1,'X')
                  UNION ALL
                  SELECT ColA, ColB FROM yourtable WHERE (ColA, ColB)=(1,'Y')
                  ORDER BY (ColA, ColB)=(1,'X') DESC
                  LIMIT 1)

ColA=1如果至少有一行具有and ,则子查询将返回 (1, 'X') ,否则如果至少有一行具有此类值ColB='X',则它将返回。(1,'Y')

如果它们都存在,则按(ColA, ColB)=(1,'X')DESC 排序并使用LIMIT 1可确保优先级为(1, 'X').

或者这个使用 OR:

SELECT *
FROM yourtable
WHERE
  ((ColA, ColB) = (1, 'Y')
   AND NOT EXISTS(SELECT NULL
                  FROM yourtable
                  WHERE (ColA, ColB)=(1,'X')))
  OR
  ((ColA, ColB) = (1, 'X'))

在此处查看小提琴。

于 2013-04-01T18:50:36.103 回答
0

我只会使用两个单独的查询来做到这一点。第一个查询是ColA = 1 AND colB = 'X'. 如果它没有返回结果,那么第二个查询将运行到 acquire (1, Y)

于 2013-04-01T18:46:28.123 回答
0

LEFT JOIN如果我正确理解了您的要求, 这是一种仅使用 a 的方法。

SELECT T.ColA, T.ColB
FROM YourTable T
  LEFT JOIN (
    SELECT ColA
    FROM yourtable T
    WHERE ColB = 'X'
    ) T2 ON 
      T.ColA = T2.ColA
WHERE T.ColB = 'X' OR T2.ColA IS NULL

SQL 小提琴演示

我假设如果同一个可乐有多个记录,则返回带有 colb=X 的记录(如果存在)。否则,按原样返回该行 - 因此结果中有 2 Z:

结果:

COLA   COLB
1      X
2      Z
于 2013-04-01T18:58:49.663 回答
0
select T.colA,T.colB
from table T
where T.colA = ANY (select colA from table where colB != T.colB);
于 2014-07-30T16:49:09.330 回答