具有WHERE条件的SQL查询,允许空字段

时间:2019-03-19 12:59:38

标签: sql sql-server

很抱歉,标题不太清楚,坦率地说,我真的不知道如何用简单的单词来解释它。我有以下问题。

我有这个查询:

SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
WHERE ASIG_ACTIVA = 'No'
ORDER BY EQUI_SERIE ASC;

我希望它显示EQUIPO表中所有在ASIGNACION表中被引用或未被引用的元素,如果被引用,我希望它仅显示那些在其上具有“否”值的元素。 ASIG_ACTIVA列。我尝试了不同的方法,但无法从互联网上找到所需的内容。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

更改连接条件,在连接上添加ASIG_ACTIVA = 'No'

SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
 and ASIG_ACTIVA = 'No'

ORDER BY EQUI_SERIE ASC;

答案 1 :(得分:1)

您可以通过限制联接表来做到这一点。

SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
  LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
                      AND ASIGNACION.ASIG_ACTIVA = 'No'
ORDER BY EQUI_SERIE ASC;

通过将AND添加到联接中,可以将联接表ASIGNACION限制为仅在列no中具有ASIGN_ACTIVE的行
这样您将获得ASIGNACION中所有相关且具有no作为值的行。
由于它是左联接,因此对于不相关或具有yes作为值的每一行,您还将获得NULL。

答案 2 :(得分:1)

猜测 ,其中ASIG_ACTIVA是表ASIGNACION中的一列,而不是EQUIPO(这就是别名很重要的原因)。如果是这样,请将WHERE移至ON

SELECT E.EQUI_SERIE
FROM EQUIPO E
     LEFT JOIN ASIGNACION A ON E.EQUI_SERIE = A.EQUI_SERIE
                           AND A.ASIG_ACTIVA = 'No'
ORDER BY E.EQUI_SERIE ASC;

答案 3 :(得分:0)

作为其他答案的补充,我将向您解释为什么您的查询无法按预期运行,您得到了以下信息:

SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
WHERE ASIGNACION.ASIG_ACTIVA = 'No'
ORDER BY EQUIPO.EQUI_SERIE ASC;

这里的问题是where子句正在过滤那些具有ASIGNACION.ASIG_ACTIVA作为NULL的值(基于LEFT JOIN),并且据我所知,您需要具有NULL或“ No”值的记录。 因此,您可以使用上面给出的解决方案,或者仅添加到where子句:“ OR ASIGNACION.ASIG_ACTIVA IS NULL”,获得以下信息:

SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
WHERE ASIGNACION.ASIG_ACTIVA = 'No' OR ASIGNACION.ASIG_ACTIVA IS NULL
ORDER BY EQUIPO.EQUI_SERIE ASC;