我目前正在使用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
答案 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的主键,为什么你有两个表具有完全相同的匹配主键?它不是一个标准化的布局。但话说回来,有时候去标准化是有道理的。