Sql 返回重复项的查询 将ANSI_空值设置为ON 在上设置带引号的\u标识符 去 更改过程[dbo].[PrintQuickBill](@BillNo int) 作为 选择A.BillNo, A.BillDate, 客户名称, A.地址:, A.客户ID, A.Billamt, A.BillPartAmt, A.Servatasamt, A.瓦塔姆, A.BillNetAmt, 来自dbo.tblQuickBillMain A 内部联接[dbo].tblQuickBilll 在A.BillNo=L.BillNo上 内部联接[dbo].TBLQuickBillP 在A.BillNo=P.BillNo上 交叉连接dbo.CompanyInfo 其中A.BillNo=@BillNo 按客户名称订购
此Sql 返回重复项的查询 将ANSI_空值设置为ON 在上设置带引号的\u标识符 去 更改过程[dbo].[PrintQuickBill](@BillNo int) 作为 选择A.BillNo, A.BillDate, 客户名称, A.地址:, A.客户ID, A.Billamt, A.BillPartAmt, A.Servatasamt, A.瓦塔姆, A.BillNetAmt, 来自dbo.tblQuickBillMain A 内部联接[dbo].tblQuickBilll 在A.BillNo=L.BillNo上 内部联接[dbo].TBLQuickBillP 在A.BillNo=P.BillNo上 交叉连接dbo.CompanyInfo 其中A.BillNo=@BillNo 按客户名称订购,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,此SELECT语句多次返回相同的结果。如果我有1条记录,结果显示它3次。如果我将@BillNo=1传递给过程,它应该只返回一行,但它返回3行,它们是相同的 您的查询与表CompanyInfo有交叉连接。它返回三行,因为交叉联接(CompanyInfo)中的表有三行。您没有使用CompanyInfo的任何列,因此我认为不需要交叉连接 您的查询与表CompanyInfo有交叉连接。它返回三行,因为交叉联接(CompanyInfo)中的表有三行。您没有使用CompanyInfo的任何列,因此我认为不需
SELECT
语句多次返回相同的结果。如果我有1条记录,结果显示它3次。如果我将@BillNo=1
传递给过程,它应该只返回一行,但它返回3行,它们是相同的 您的查询与表CompanyInfo有交叉连接。它返回三行,因为交叉联接(CompanyInfo)中的表有三行。您没有使用CompanyInfo的任何列,因此我认为不需要交叉连接 您的查询与表CompanyInfo有交叉连接。它返回三行,因为交叉联接(CompanyInfo)中的表有三行。您没有使用CompanyInfo的任何列,因此我认为不需要交叉连接 重复是由以下三种情况之一(或它们的组合)造成的:
- 当公司信息有多条记录时(如3条记录)李>
- tblQuickBillLabor.BillNo有重复项时李>
- 当tblQuickBillParts.BillNo有重复项时李>
SELECT
列表中没有显示来自其他表的任何数据。如果您还想在SELECT
列表中包含来自其他表的列,您会注意到这些列在结果中会有不同的值,其中第一组列会有重复项
但是,由于您在查询中根本不使用表CompanyInfo中的值,因此您应该以任何方式删除查询中的交叉连接CompanyInfo
部分:除非您在选择列表中实际包含该表中的列,否则它没有任何用途。删除此选项可能已经完全解决了您的问题
但是,表名tblQuickBillParts强烈表明,您将在该表中为同一BillNo拥有多条记录,否则您不会以复数形式将其称为Parts。对于表tblQuickBillLabor,情况可能也是如此
要解决与tblQuickBillLabor.BillNo和tblQuickBillParts.BillNo的联接引起的这些潜在问题,请参阅以下解决方案:
解决方案A:根本不连接表
由于您仅从tblQuickBillMain中选择值,因此最终可能根本不需要连接其他表,只需编写:
SELECT BillNo,
BillDate,
CustomerName,
Address,
CustomerId,
BillLaborAmt,
BillPartAmt,
ServTaxAmt,
VatAmt,
BillNetAmt,
FROM dbo.tblQuickBillMain
WHERE BillNo=@BillNo
ORDER BY CustomerName
这样,您将不会获得重复的记录,但您也将获得在tblQuickBillLabor.BillNo或tblQuickBillParts.BillNo中没有相应记录的记录。如果需要匹配,则检查下一个解决方案
解决方案B:用子查询替换联接
如果与tblQuickBillLabor.BillNo和tblQuickBillParts.BillNo进行联接的原因是您希望确保这些表中至少有一条匹配记录,则使用WHERE
条件,改为BillNo in(子查询)
:
请注意,使用此SQL语句,您不需要将表别名为A、p、L,因为没有歧义
解决方案C:坏选择DISTINCT
从结果集中删除重复项的一种简单但不可取的方法是在单词后面选择
有了这个“解决方案”,你就无法真正找到问题的根源;您只需忽略它并请求一个不重复的结果集。因此,我真的建议您选择解决方案A或B,以最适合您的要求为准。重复的结果来自以下三种情况之一(或它们的组合):
- 当公司信息有多条记录时(如3条记录)李>
- tblQuickBillLabor.BillNo有重复项时李>
- 当tblQuickBillParts.BillNo有重复项时李>
您看不到某些结果之间的差异,因为在SELECT
列表中没有显示来自其他表的任何数据。如果您还想在SELECT
列表中包含来自其他表的列,您会注意到这些列在结果中会有不同的值,其中第一组列会有重复项
但是,由于您在查询中根本不使用表CompanyInfo中的值,因此您应该以任何方式删除查询中的交叉连接CompanyInfo
部分:除非您在选择列表中实际包含该表中的列,否则它没有任何用途。删除此选项可能已经完全解决了您的问题
但是,表名tblQuickBillParts强烈表明,您将在该表中为同一BillNo拥有多条记录,否则您不会以复数形式将其称为Parts。对于表tblQuickBillLabor,情况可能也是如此
要解决与tblQuickBillLabor.BillNo和tblQuickBillParts.BillNo的联接引起的这些潜在问题,请参阅以下解决方案:
解决方案
SELECT BillNo,
BillDate,
CustomerName,
Address,
CustomerId,
BillLaborAmt,
BillPartAmt,
ServTaxAmt,
VatAmt,
BillNetAmt,
FROM dbo.tblQuickBillMain
WHERE BillNo=@BillNo
AND BillNo IN (SELECT BillNo FROM [dbo].tblQuickBillLabor)
AND BillNo IN (SELECT BillNo FROM [dbo].tblQuickBillParts)
ORDER BY CustomerName