2017-03-07 146 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;