使用多个列唯一组合选择唯一行,但不包括不适用的值

时间:2017-06-16 15:07:39

标签: mysql sql select exists

我有一个包含三列的表,让我们定义它并用样本数据填充它:

   A   |   B   |   C   |
------ | ----- | ------|
  A1   |   NA  |  NA   | 
  A1   |   B1  |  NA   |
  NA   |   B1  |  NA   |
  NA   |   B1  |  C1   |
  NA   |   NA  |  C1   |

我们可以看到组合(A,B,C)是独一无二的。我需要一个选择,它将使用参数选择确切的一行:A:B:C。例如:

1)如果我有:A = A1,:B = SOME_B,:C = SOME_C。它应该选择第一行,因为列A具有完全匹配,而列B和C不适用。

2)如果我有:A = SOME_A,:B = SOME_B,:C = SOME_C。它不应该返回任何东西。

首先尝试是:

SELECT * 
FROM SAMPLE_TABLE 
WHERE (A = :A OR A = 'NA') AND (B = :B OR B = 'NA') AND (C = :C OR C = 'NA');

这前两行返回。错了,正如预期的那样。那不是我想要的。

第二次尝试:

SELECT * 
FROM SAMPLE_TABLE 
WHERE (A = :A OR (A = 'NA' AND NOT EXISTS(SELECT 1 FROM SAMPLE_TABLE WHERE A = :A AND (B = :B OR B = 'NA') (C = :C OR C = 'NA')) AND (B = :B OR B = 'NA') AND (C = :C OR C = 'NA');

它的工作原理和逻辑是正确的,但对于B和C,我需要做同样的事情。之后,我需要为A列修改NOT EXISTS,其中应包括B和C的NOT EXISTS,对于A列也应该包括NOT EXISTS,依此类推。我得到一个循环。

任何想法我们如何编写简单的SQL来解决这样的问题?或者我只是想念一些愚蠢的事情?

修改

哦,这是我的错,不能说清楚。让我们看看业务示例(表 TEAM_MATRIX ):

COUNTRY|PRIORIT|  TEAM |
------ | ----- | ------|
  NA   |  NA   | GLOB_T| 
  UK   |  LOW  | UK_T1 |
  UK   |  MED  | UK_T2 |
  UK   |  HIGH | UK_T3 |
  US   |  NA   | US_T  |
  US   |  LOW  | US_T1 |

Coulmns国家/地区和优先级可以视为输入参数。列组应被视为输出。几个例子:

1)假设我们有参数:country = FR,priority = LOW。然后输出团队应该是GLOB_T,因为没有这样的组合FR和LOW。 (NA意味着我们不在乎)。

2)如果国家/地区是US且优先级为LOW =>输出团队应该是US_T1,因为我们有US和LOW组合。

3)如果国家/地区为US且优先级为MED =>输出团队应该是US_T,因为我们有US和NA的组合(NA意味着我们不关心)。

有没有办法让SQL遵循这个逻辑?

SELECT TEAM 
FROM TEAM_MATRIX 
WHERE (COUNTRY = ?1 OR COUNTRY = 'NA') AND (PRIORIT = ?2 OR PRIORIT = 'NA');

这里?1 - 国家参数,?2 - 优先级参数。这不起作用,例如将始终选择组合((NA,NA) - > GLOB_T)。

谢谢!

0 个答案:

没有答案