2009-10-15 38 views
0
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,因爲它返回我的最後一行用一個表assosiates ..如果你需要我可以張貼創建查詢

回答

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 :-) 
+0

你看我確實有查詢工作,它是返回行的螺旋負載...我希望我們能做到這一點,所以它只返回最後..我們可以限制它 – 2009-10-15 03:48:15

+0

如果有我接受你的沒有別人 – 2009-10-15 03:54:23

+0

是的,我看到第一個代碼不工作,我急着吃午飯。我現在編輯它,我認爲更正的代碼是正確的 – 2009-10-15 04:40:26

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