2017-03-07 144 views
1

我的問題是這樣的:我需要將兩個表連在一起,保留一個表中的所有數據。這將是一對一的比賽。我需要在一對多比賽中設定標準。例如:有沒有辦法將變量條件放入SQL中的連接中?

TableA       TableB 
Name Date  Cat   Name Date 
AAA  1/1/17 Z11   AAA  1/2/17 
AAA  1/4/17 Y22   AAA  1/6/17 
AAA  1/7/17 X33   BBB  1/2/17 
BBB  1/1/17 A44 
BBB  1/3/17 B55 

我需要加入到表A表B,保持所有的表B,從記錄,加盟的名稱列。我希望加入到TableA中的「本地記錄」是仍然大於TableB中的日期的最小日期。因此,理想的結果是:

Results 
TableB.Name TableB.Date TableA.Cat 
AAA   1/2/17   Y22 
AAA   1/6/17   X33 
BBB   1/2/17   B55 

我知道我要上兩個人的名字外連接,但不知道如何在「地方標準」工作缺乏一個更好的方式來句話吧。這是可能的,它是如何完成的?

+1

見http://meta.stackoverflow.com/questions/333952/why-should- i-provide-an-mcve-for-what-seems-to-the-very-simple-sql-query – Strawberry

回答

2

我會從tableA中創建一個子查詢,以獲得您想要的結果並加入。

子查詢排除小於b.dates的a.dates。隨着那些剩下的,抓住最小。

加入了這一切到tableB的

SELECT b.name , 
     b.date , 
     a.cat 
FROM tableb b 
     JOIN (SELECT a1.name , 
         MIN(a1.date) AS date 
       FROM  tableA a1 
         JOIN tableb b1 ON a1.name = b1.name 
              AND a1.date > b1.date 
      ) a ON a.date > b.date 
        AND a.name = b.name; 
+0

這不起作用,因爲一件事日期不等於* – Bohemian

+0

啊,對不起,習慣的力量,我會把=改成一個> – LordBaconPants

+1

其實他想要A的最小日期大於B.我認爲你的解決方案重刑是正確的,但你的子查詢也需要包含tableB。 – jfneis

1

我會用一個相關子查詢:

select b.*, 
     (select a.cat 
     from a 
     where a.name = b.name and a.date > b.date 
     order by a.date asc 
     limit 1 
     ) as cat 
from b;