INNER JOIN带有一张大桌子

时间:2017-04-05 18:04:23

标签: sql join

我目前正在使用Microsoft Access 2013,我正在尝试将Table1和Table2连接在一起,但问题是Table2非常庞大。表1是PK作为零件供应商的零件,供应商组合的列表。表2是我创建的表,其中包含每个部件,供应商组合的top2最新报价。所有这些引用都是从带有PK quote_id的表中提取的。我认为我的Table2创建可能是问题所在,因为我无法使用每个部件,供应商组合创建Table2(我必须按供应商过滤掉)。这是我用于Table2的查询。

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

我想知道是否有一种方法可以使用Table1中的id来过滤Table2?像这样:

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

2 个答案:

答案 0 :(得分: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列上创建索引,或尝试从结果中限制所选列。

答案 1 :(得分:0)

真正的解决方案是您需要TABLE2.id上的索引。我假设它不是该表的主键,因为它可能是TABLE1的主键,为什么你有两个表具有完全相同的匹配主键?它不是一个标准化的布局。但话说回来,有时候去标准化是有道理的。

相关问题