2010-07-21 69 views
1

我有5个表,并试图加入1,但我得到4每个记录。我如何使用正确的JOIN语句。加入多个表

SELECT tbl_meter.[cdate] AS 'CDate', 
tbl_meter_backup.[machine_no], 
tbl_machines.[accounting_denomination] AS 'Denom', 
(tbl_meter.[turnover]- tbl_meter_backup.[turnover])* tbl_machines.[accounting_denomination] AS 'Turnover', 
(tbl_meter.[total win]- tbl_meter_backup.[total win])* tbl_machines.[accounting_denomination] AS 'Total win', 
(tbl_meter.[games played]-tbl_meter_backup.[games played]) AS 'Games Played', (tbl_meter.[credit in]-tbl_meter_backup.[credit in]) * tbl_machines.[accounting_denomination] AS 'Credit IN', 
(tbl_meter.[Bill in]-tbl_meter_backup.[Bill in])* tbl_machines.[accounting_denomination] AS 'Bill In', 
(tbl_meter.[cancel credit]-tbl_meter_backup.[cancel credit])* tbl_machines.[accounting_denomination] AS 'Cancel Credit', 
tbl_open_backup.[amount] AS 'cgOpen', 
tbl_cancel_backup.[amount] AS 'cgCancel' 
FROM 
tbl_machines, 
tbl_meter, 
tbl_meter_backup, 
tbl_open_backup, 
tbl_cancel_backup 

INNER JOIN tbl_meter ON 
tbl_meter_backup.[Machine_No] = tbl_meter.[Machine_No] AND tbl_machines.[local_no]=tbl_meter.[machine_no] AND tbl_open_backup.[machine_no]=tbl_meter.[machine_no] AND tbl_cancel_backup.[machine_no]=tbl_meter.[machine_no] 
WHERE tbl_meter_backup.[cDate] = @StartDate AND tbl_meter.[cDate] = @EndDate AND tbl_open_backup.[cdate][email protected] AND tbl_cancel_backup.[cdate][email protected]; 

回答

2

首先将您的synatx修复为易于阅读和维护的显式连接,没有任何借口可以使用隐式连接,它们很容易出错,而且过时18年,特别难以维护,因此在混合时需要这样做。我期望系统可能会对此产生困惑,以及你没有正确地进行连接。在隐式连接中,连接标准在where子句中不是您使用的显式连接的on子句。你也加入了同一张桌子两次。

因此,清理后的连接是否仍然存在数据问题?

SELECT tbl_meter.[cdate] AS 'CDate', 
tbl_meter_backup.[machine_no], 
tbl_machines.[accounting_denomination] AS 'Denom', 
(tbl_meter.[turnover]- tbl_meter_backup.[turnover])* tbl_machines.[accounting_denomination] AS 'Turnover', 
(tbl_meter.[total win]- tbl_meter_backup.[total win])* tbl_machines.[accounting_denomination] AS 'Total win', 
(tbl_meter.[games played]-tbl_meter_backup.[games played]) AS 'Games Played', (tbl_meter.[credit in]-tbl_meter_backup.[credit in]) * tbl_machines.[accounting_denomination] AS 'Credit IN', 
(tbl_meter.[Bill in]-tbl_meter_backup.[Bill in])* tbl_machines.[accounting_denomination] AS 'Bill In', 
(tbl_meter.[cancel credit]-tbl_meter_backup.[cancel credit])* tbl_machines.[accounting_denomination] AS 'Cancel Credit', 
tbl_open_backup.[amount] AS 'cgOpen', 
tbl_cancel_backup.[amount] AS 'cgCancel' 
FROM 
tbl_machines 
INNER JOIN tbl_meter ON tbl_machines.[local_no]=tbl_meter.[machine_no] 
Inner join tbl_meter_backup ON tbl_meter_backup.[Machine_No] = tbl_meter.[Machine_No] 
Inner join tbl_open_backup ON tbl_open_backup.[machine_no]=tbl_meter.[machine_no] 
Inner join tbl_cancel_backup on tbl_cancel_backup.[machine_no]=tbl_meter.[machine_no] 
WHERE tbl_meter_backup.[cDate] = @StartDate AND tbl_meter.[cDate] = @EndDate AND tbl_open_backup.[cdate][email protected] AND tbl_cancel_backup.[cdate][email protected]; 

如果是这样,您的一个或多个表中有更多的记录用于连接中的项目。这将需要特殊处理,因为您需要确定如何知道您想要的记录。

+0

太好了。它正在工作。非常感谢你帮助我。 – Hakan 2010-07-22 08:48:33

2

首先,有没有必要包括在FROM所有这些表,如果你正在使用INNER JOIN

二,下列条件之一为真:

  1. 每个机器多米,对于给定的@EndDate
  2. 每个机器多meter_backups对于给定的@StartDate
  3. 有多种每台机器open_backups对于给定的@EndDate
  4. 每个机器多cancel_backups对于给定的@EndDate

看看是否有下面的行显示出比 “1” 多为计数:

  1. SELECT count(*), met.[Machine_No], met.[cDate] as EndDate FROM tbl_meter met GROUP BY met.[Machine_No], met.[cDate] ORDER BY count(*) DESC

  2. SELECT count(*), metB.[Machine_No], metB.[cDate] as StartDate FROM tbl_meter_backup metB GROUP BY metB.[Machine_No], metB.[cDate] ORDER BY count(*) DESC

  3. SELECT count(*), openB.[Machine_No], openB.[cDate] as EndDate FROM tbl_open_backup openB GROUP BY openB.[Machine_No], openB.[cDate] ORDER BY count(*) DESC

  4. SELECT count(*), canB.[Machine_No], canB.[cDate] as EndDate FROM tbl_cancel_backup canB GROUP BY canB.[Machine_No], canB.[cDate] ORDER BY count(*) DESC