2017-04-05 117 views
1

我目前使用的是Microsoft Access 2013,並且我試圖將Table1和Table2連接在一起,但問題在於Table2很大。表1列出了供應商作爲供應商的部分供應商組合。表2是我用每個零件供應商組合的top2最新報價創建的表格。所有這些引號都是從PK quote_id的表格中提取的。我認爲我創建Table2可能是問題,因爲我無法創建Table2與每個部分,供應商組合(我必須由供應商過濾)。這是我用於Table2的查詢。INNER JOIN與一張大桌子

a.part, a.vendor, a.quote_date 
FROM quoteTable AS a 
WHERE a.quote_date > DATEADD("yyyy", -3, DATE()) AND 
a.quote_date IN 
(SELECT TOP 2 quote_date 
FROM quoteTable 
WHERE quote_date > DATEADD("yyyy", -3, DATE()) AND 
part=a.part AND vendor=a.vendor 
ORDER BY quote_date DESC) 

如果有人知道一個更好的方式來選擇從表中的前2最新報價爲每個零件,供應商的組合,我真的很感激它。至於加入,這工作,但會花費太長時間。

SELECT * 
FROM Table1 AS a INNER JOIN Table2 AS b ON a.id = b.id 

我想知道是否有一種方法,我可以使用表1中的ID過濾表2?事情是這樣的:

SELECT * 
FROM Table1 AS a INNER JOIN 
    (SELECT * FROM Table2 WHERE id=a.id) AS b ON a.id = b.id 
+1

您是否爲表格創建索引? –

+0

那麼如果你選擇海量數據,那麼需要很長時間。你真的需要所有的記錄嗎? –

+0

性能問題應該包括'EXPLAIN ANALYSE'和一些關於表格大小,索引,當前時間表現,期望時間等的信息。'Slow'是一個相對術語,我們需要一個真正的值來比較。 –

回答

0

你肯定可以使用:

SELECT * 
FROM Table1 AS a 
INNER JOIN 
(SELECT * FROM Table2 WHERE id=a.id) AS b 
ON a.id = b.id 

或者你可以使用:

With CTE 
as 
(
SELECT * 
FROM Table2 
WHERE id in (select id from table1) 
) 
SELECT * 
FROM Table1 AS a 
INNER JOIN 
CTE 
ON CTE.Id = a.Id 

出於性能方面的問題,您可以嘗試從兩個id列上創建索引表格,或嘗試限制結果中選定的列。

+0

在另一個select中,特別是在IN子句中,有一個select,這是非常糟糕的SQL。你幾乎可以打賭,只要SELECT * FROM TABLE 2其中的id(表1中的select id)大約是最糟糕的,性能明智的,你可以寫。 – AgapwIesu

+1

@AgapwIesu我碰巧看過一篇文章,說有些情況下'IN'有比較好的性能,特別是比'Join'更好 – LONG

+1

當你有一個像我在我的評論中突出顯示的語句,不,你會沒有很好的表現。即使使用索引,也比他所加入的要糟得多。 IN子句通常只能提供離散值列表,而不是另一個表中的select語句,因此性能更好。 – AgapwIesu

0

真正的解決方案是您需要TABLE2.id上的索引。我假設它不是該表的主鍵,因爲它可能是TABLE1的主鍵,並且爲什麼你會有兩個具有完全相同主鍵的表?這不會是一個規範化的佈局。但是,再次,有些時候解規範是有意義的。

+0

「爲什麼你會有兩張完全相同的表,匹配主鍵」 - 也許是因爲他們模擬的是同一個真實生活實體?例如兩個表中的'TABLE1'模型書籍,'TABLE2'模型非小說類書籍,'id'模型[ISBN](https://en.wikipedia.org/wiki/International_Standard_Book_Number),而且OP的命名規則很差。 – onedaywhen

+0

「這不是標準化的佈局」 - 如果您認爲表格沒有完全標準化,請注意說明您認爲它們目前處於什麼樣的正常形式以及如何修復設計以使其完全標準化? – onedaywhen

+0

表1的PK是供應商的一部分。表2的PK是quote_id,但是我加入了部分供應商的表格。基本上,table1是一個零件列表,table2是每個零件的前兩個最近引號的列表。對不起,沒有更新的問題 –