2013-03-12 93 views
0

我正在构建一个包含车辆组件的数据库。有三个表:如何在多个表上运行SQL查询

  • 车辆表(车辆的清单,每一个车辆具有唯一的ID号)轮胎
  • 轮胎表(列出的序列号(SN)和零件号(PN)与沿,它的安装(ID))
  • 筛选表车辆(列出的序列号(SN),用于与它的安装上(ID))

我会车辆沿着过滤器和部件号(PN)喜欢创建一个Access SQL查询,它为所有的过滤器提供序列号和零件号安装在特定车辆上的轮胎(假设我们正在搜索车辆ID为5的本田思域)。我创建了下面的代码,但它返回了所有结果的笛卡尔乘积。每辆车上都安装了两个过滤器和两个轮胎,以便在结果合并和复制时返回以下结果。

  • 轮胎1(PN and SN)|过滤器1(PN和SN)
  • 轮胎1(PN和SN)|过滤器2(PN和SN)
  • 轮胎2(PN和SN)|过滤器1(PN和SN)
  • 轮胎2(PN和SN)|过滤器2(PN和SN)

反正是有,我可以创建一个查询将返回:

  • 轮胎1(PN和SN)
  • 轮胎2(PN和SN)
  • 过滤器1(PN和SN)
  • 滤波器2(PN和SN)

我的代码是下面:

SELECT DISTINCT Tires.SN, Tires.PN, Tires.ID, Filters.ID, Filters.PN, Filters.SN, 
Vehicle.ID 
FROM (Vehicle 
INNER JOIN Filters ON Vehicle.[ID] = Filters.[ID]) 
INNER JOIN Tires ON Vehicle.[ID] = Tires.[ID] 
WHERE Vehicle.[ID] = 5; 

谢谢!

+0

你的数据不是很标准化的,因为轮胎和filgers有相同的数据(至少在你的例子中,最好只有一个表,并定义组件是“轮胎”还是“过滤器”,这样你就不必从两者中进行选择)另外,如果你以后决定添加“带”,你不必写更多的查询,数据将驱除额外的组件。 – xQbert 2013-03-12 00:13:20

+0

要回答你的问题,尽管它可以使用当前模式来完成,但是我们必须使得assu每辆车总是有2个轮胎和2个过滤器,并且过滤器的内径较低与同一辆车的轮胎内径较低有关。如果随着时间的推移将要扩展数据库,这将变得越来越难以维护。 – xQbert 2013-03-12 00:20:37

+0

为什么你需要他们作为列?它不像xQbert所说的那样是可扩展的。只要选择它们作为组合结果集的行。 – peterm 2013-03-12 00:23:27

回答

0

如果你真的需要它只是Vehicle.ID的一个值,那么你可以使用查询与UNION这样的:

SELECT 'Tire',Tires.SN, Tires.PN 
FROM Tires 
WHERE Vehicle.[ID]=5 
UNION 
SELECT 'Filter',Filters.PN, Filters.SN 
FROM Filters 
WHERE Vehicle.[ID]=5 
ORDER BY 1;