在连接表时不识别Where子句中的列

时间:2009-10-15 03:34:30

标签: sql mysql

SELECT * FROM a 
JOIN (SELECT * FROM b WHERE b.aId = a.Id) AS c ON c.aId = a.Id

它说不承认:a .Id在Where子句中。

我知道它可能导致我使用临时表和a.Id无法通过,但我们有什么方法可以做到这一点?

因为这是实际发生的事情

SELECT * 
  FROM a 
  JOIN (SELECT * FROM b 
         WHERE b.aId = a.Id 
      ORDER BY b.dateReg DESC
         LIMIT 1) AS c ON c.aId = a.Id

我需要ORDER BY b.dateReg DESC LIMIT 1因为它返回了与a表相关的最后一行..如果你需要我可以发布创建查询

2 个答案:

答案 0 :(得分:2)

- 查找b

上的最后几行
select * from b x 
where exists(
     select id 
     from b y 
     where y.id = b.id 
     having max(y.dateReg) = x.dateReg
     group by id
     )

- 然后将b加入a,这是最终查询:

select * from a
join 
(
     select * from b x 
     where exists(
         select id 
         from b y 
         where y.id = b.id 
         having max(y.dateReg) = x.dateReg
         group by id
         )

) as last_rows on last_rows.id = a.id

- 更简单:

select * 
from a join b x on a.id = x.id
where exists(
    select id
    from b y
    where y.id = b.id
    having max(y.dateReg) = x.dateReg
    group by id)

- 或者你是否会使用postgres:

select DISTINCT ON (a.id) * 
from a join b x on a.id = x.id
order by a.id, b.dateReg DESC
-- look ma! no group by!    

-- nothing beats postgresql's simplicity :-)

答案 1 :(得分:1)

尝试:

SELECT DISTINCT *
  FROM A
  JOIN B b ON b.aid = a.id
  JOIN (SELECT b.aid,
               MAX(b.datereg) 'max_datereg'
          FROM B b
      GROUP BY b.aid) md ON md.aid = b.aid
                        AND md.max_datereg = b.datereg

如果您确实需要与该员工关联的第一条记录,请使用:

SELECT DISTINCT *
  FROM A
  JOIN B b ON b.aid = a.id
  JOIN (SELECT b.aid,
               MIN(b.datereg) 'min_datereg'
          FROM B b
      GROUP BY b.aid) md ON md.aid = b.aid
                        AND md.min_datereg = b.datereg