Sql 使用SUQBQUERES和多个where的多个join子句

Sql 使用SUQBQUERES和多个where的多个join子句,sql,postgresql,Sql,Postgresql,我有4张桌子: ad image placement ad_placement - many to many intermediary table between ad and placement 该图像具有从FK到ad的转换 结构如下: ad id | url 1 http:// 2 http:// 3 http:// placement id | name 1 name_1 1 name_2 ad_placement 标识|广告标识|位置标识 1

我有4张桌子:

ad
image
placement
ad_placement - many to many intermediary table between ad and placement
该图像具有从FK到ad的转换

结构如下:

ad

id | url

1   http://
2   http://
3   http:// 


placement

id | name

1    name_1
1    name_2


ad_placement
标识|广告标识|位置标识 1 1 1 2 1 2 3 2 2

image

id  | image    | ad_id 
1     http://    1
2     http://    2
3     http://    3
我想从广告和图像中获取字段、url和图像,其中placement=name_1

查询中的“**”仅用于显示我所指的内容

  SELECT A.id, A.url, I.image as image 
  FROM ad AS A LEFT JOIN (       
  SELECT ADP.ad_id FROM ad_placement *AS ADP*
  JOIN placement AS P ON ADP.placement_id = P.id **WHERE P.name='name_1'**) AS AP ON A.id=AP.ad_id  
  LEFT JOIN ( SELECT ad_id,image FROM image) AS I ON I.ad_id = A.id 
  WHERE A.is_active=TRUE
当我尝试在这一行使用where时出错

JOIN ads_adplacement AS P ON ADP.adplacement_id = P.id WHE...

missing FROM-clause entry for table "adp"
删除“Where”有效,但不是我需要的


我用斜体添加了建议的as ADP,见**,我得到了相同的结果,比如where子句被忽略了

第一个左连接的意义是什么

SELECT A.id, A.url, I.image as image 
  FROM ad AS A 
  LEFT JOIN image AS I ON I.ad_id = A.id 
  WHERE A.is_active=TRUE
编辑:也许你是这个意思

SELECT A.id, A.url, I.image as image 
  FROM ad AS A 
  LEFT JOIN image AS I ON I.ad_id = A.id 
  WHERE A.is_active=TRUE and
  a.id in 
  (select ad_id 
   from ad_placement adp 
   inner join placement p on p.Id = adp.placement_id 
   where p.Name='name 1');

你能分享完整的查询吗?我想看看你在哪里添加where子句。但是,您似乎正在两个连接之间添加where。 加入所有表后,可以添加到何处

编辑


您尚未定义表别名adp。你可能是想从广告位置adp JOIN PLACEATION作为P on写…@a_horse_,没有名字;你能发布一个简单的完整答案吗;我有4张桌子,在广告和位置之间有很多联系;所以我的问题是关于这个关系的where子句,您可能有4个或40个表,但是为了查询,为什么需要它?您能否在代码中共享表结构以及您真正想要的内容。对于SQL中需要的部分,Join是不必要的。@a_horse_和_no_name我不明白你在说什么。从他的sqli.ad_id=A.id.对不起,我误读了连接。你是对的。带有ad_placement和placement的派生表是无用的,因为没有使用任何列,并且外部联接不会删除任何行。我添加了表结构。我认为问题确实包含完整的查询-除了缺少的别名,它是正确的。我添加了表结构;我使用子查询与使用多个查询相比,这会影响速度吗?您编写第二个联接的方式甚至无助于过滤记录,您可以按照答案编辑中提到的方式编写查询。
SELECT A.id, A.url, I.image as image 
FROM ad AS A 
LEFT JOIN ad_placement AS AP ON A.id=AP.ad_id
LEFT JOIN placement AS P ON AP.placement_id = P.id
LEFT JOIN image I ON I.ad_id = A.id 
WHERE A.is_active=TRUE and P.name='name_1'