或查询不返回结果而单独的查询返回结果的地方

时间:2019-04-01 18:27:27

标签: sql postgresql join

此SQL查询返回一些结果:

select
  "titres".*
from
  "titres"
  inner join "titres_titulaires" as "titulaires_join" on "titulaires_join"."titre_etape_id" = "titres"."titulaires_titre_etape_id"
  inner join "entreprises" as "titulaires" on "titulaires_join"."entreprise_id" = "titulaires"."id"
where
  ("titulaires"."nom" like '%sma%')

我希望此查询至少返回相同的结果:

select
  "titres".*
from
  "titres"
  inner join "titres_titulaires" as "titulaires_join" on "titulaires_join"."titre_etape_id" = "titres"."titulaires_titre_etape_id"
  inner join "entreprises" as "titulaires" on "titulaires_join"."entreprise_id" = "titulaires"."id"
  inner join "titres_amodiataires" as "amodiataires_join" on "amodiataires_join"."titre_etape_id" = "titres"."amodiataires_titre_etape_id"
  inner join "entreprises" as "amodiataires" on "amodiataires_join"."entreprise_id" = "amodiataires"."id"
where
  (
    "titulaires"."nom" like '%sma%'
    or "amodiataires"."nom" like '%sma%'
  )

,但它返回一个空数组。

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

使用左连接代替内连接进行最后2个连接

select
  "titres".*
from
  "titres"
  inner join "titres_titulaires" as "titulaires_join" on "titulaires_join"."titre_etape_id" = "titres"."titulaires_titre_etape_id"
  inner join "entreprises" as "titulaires" on "titulaires_join"."entreprise_id" = "titulaires"."id"
  left join "titres_amodiataires" as "amodiataires_join" on "amodiataires_join"."titre_etape_id" = "titres"."amodiataires_titre_etape_id"
  left join "entreprises" as "amodiataires" on "amodiataires_join"."entreprise_id" = "amodiataires"."id"
where
  (
    "titulaires"."nom" like '%sma%'
    or "amodiataires"."nom" like '%sma%'
  )

答案 1 :(得分:0)

我将尽力解释为什么会发生这种情况。

让我们假设titres_amodiataires中没有一行与titres中的一行匹配,即没有两行满足titres_amodiataires.titre_etape_id = titres.amodiataires_titre_etape_id

然后JOIN的结果将为空,并且在WHERE条件下应用其他过滤器也不会使其变空。