加入多个表格

时间:2010-07-21 04:19:31

标签: sql

我有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]=@enddate AND tbl_cancel_backup.[cdate]=@enddate;

2 个答案:

答案 0 :(得分:2)

首先,如果您使用FROM,则无需在INNER JOIN中包含所有这些表。

其次,以下之一是真的:

  1. 给定的@EndDate
  2. 每台机器有多个米
  3. 给定的@StartDate
  4. 每台机器有多个meter_backup
  5. 给定的@EndDate
  6. 每台计算机有多个open_backup
  7. 给定的@EndDate
  8. 每台计算机有多个cancel_backup

    查看以下任何行是否显示计数超过“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

答案 1 :(得分: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]=@enddate AND tbl_cancel_backup.[cdate]=@enddate;

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