我有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;
答案 0 :(得分:2)
首先,如果您使用FROM
,则无需在INNER JOIN
中包含所有这些表。
其次,以下之一是真的:
查看以下任何行是否显示计数超过“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
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
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
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;
如果是这样,您的一个或多个表的联接中的项目的记录多一个。这将需要特殊处理,因为您需要确定如何知道您想要的记录。