2012-04-01 60 views
0

我想結合到兩個表,我想要一個表中的日期大於另一個表的日期的最小的ID。我認爲這是一件容易的事,但它給了我一個合適的選擇。組合表給定日期標準

這裏是我天真的嘗試:

select table1.id, MIN(table2.id) 

FROM table1 
    INNER JOIN table2 
    ON table2.id = table1.id 

WHERE table1.date > table2.date 

這是不行的,因爲一旦在表1的日期比表2大於它加入所有的ID比日期更加不只是那些。這意味着無論發生什麼,它都會返回最小的ID。

感謝

編輯度:

產品

id | price_date 
--------------- 
1 | 2011-01-02 

價格

id | fid | price_date 
--------------- 
1 | 1 | 2011-01-01 
2 | 1 | 2012-01-01 

所以我想回到

product.id | price.id 
--------------------- 
    1  | 1 

回答

0

我不太喜歡這個,看起來有點蠻力。但是,你正在尋找哪種結果?

編輯匹配的樣本數據:

select id AS product_id 
     ,(select min(id) 
      from price 
      where fid = p.id 
      and price_date <= p.price_date 
     ) AS price_id 
    from product p 

EDIT2:隨着顯示FK關係的樣本數據,尼古拉的反應是一個更好的解決方案:

select p.id AS product_id 
     ,MIN(x.id) AS price_id 
    from product p 
     ,price x 
    where x.fid = p.id 
    and x.price_date <= p.price_date 
    group by p.id 
+0

嘿嘿,謝謝,但它本質上給了我同樣的事情,而是作爲一個左外連接,而不是我的內連接的功能。 – tshauck 2012-04-01 00:43:51

+0

@tshauck你可以把幾行數據與預期的結果?我認爲這與你的嘗試有點不同,因爲這裏的查詢是針對table1中的每個記錄執行的(這是我不喜歡的部分),而問題的嘗試是在兩個表之間加入ids。 (即加入是在「選擇」列表中,而不是「從」列表。 – Glenn 2012-04-01 00:48:28

+0

謝謝,我希望這是有道理的。 – tshauck 2012-04-01 01:06:04

0

我不知道我的理解相當你試圖達到什麼 - 我假設你想要返回table1中table1中每一行的min()min(),其中table1.date> table2.date。在這種情況下,您可以使用子選擇:

SELECT table1.id, (SELECT min(id) FROM table2 WHERE table1.date > table2.date) 
FROM table1 
    INNER JOIN table2 
    ON table2.id = table1.id AND table1.date > table2.date 
1

這可能是您要查找的內容。

select table1.id, 
     table1.date, 
     MIN(table2.date) Table2MinDate, 
     MIN(table2.id) Table2SmallestID 
FROM table1 
    INNER JOIN table2 
    ON table1.date < table2.date 
group by table1.id, table1.date 
order by 1, 2 

我強烈認爲,應該有Table 1和Table之間的連接條件,但它不可能是ID,因爲要求的最小ID從表2就沒有意義。它始終與table1中的id具有相同的值。

You might check Sql Fiddle

+1

@Nikola_Markonvinovic我在想這條線也是如此,但本來就是一個交叉產品。但現在,通過樣本數據,我認爲它變得更加清楚:加入是在product.id和price.fid上。那麼我顯然是更好的解決方案。 – Glenn 2012-04-01 01:42:03