显示答案2次的Sql代码

显示答案2次的Sql代码,sql,Sql,对于这段代码,我有两行要显示,当我运行它时,它返回4行,2个原始行和2个副本(与前2行相同),实际答案只有两行。为什么我会变成这样 请帮我了解一下 共有两个表,tblpurchaseorder和podetails。我只需要podetails表中的一行。但令人困惑的是,为什么它只显示4行,return SELECT p.*, po.OrderedQty, po.TotalAmount FROM tblPurchaseOrder AS p INNER JOIN PODetails AS po

对于这段代码,我有两行要显示,当我运行它时,它返回4行,2个原始行和2个副本(与前2行相同),实际答案只有两行。为什么我会变成这样

请帮我了解一下

共有两个表,
tblpurchaseorder
podetails
。我只需要
podetails
表中的一行。但令人困惑的是,为什么它只显示4行,return

SELECT p.*, po.OrderedQty, po.TotalAmount 
FROM tblPurchaseOrder  AS p
INNER JOIN PODetails  AS po ON p.PONo = po.PONo
WHERE po.PONo = '1';
TBL采购订单

4   1   1   2014-04-24  2014-04-24  Whole Sale Price                1   Nokia001    0   0   0   190 570 3   918
5   1   1   2014-04-24  2014-04-24  Whole Sale Price                1   item 1  0   0   0   87  348 3   918
4   1   1   2014-04-24  2014-04-24  Whole Sale Price                1   Nokia001    0   0   0   190 570 4   918
5   1   1   2014-04-24  2014-04-24  Whole Sale Price                1   item 1  0   0
0   87  348 4   918
详细信息

POID    PONo    POReference CreatedDate DeliveryDate    PaymentMethod    SupplierID ItemCode    IsCommit    IsPending   IsDelete    SubTotal    TotalValue
4         1        1        2014-04-24   2014-04-24   Whole Sale Price        1     Nokia001        0           0         0            190            570
5         1        1        2014-04-24   2014-04-24   Whole Sale Price        1     item 1          0           0         0             87            348

猜测缺少的单词是SELECT DISTINCT:)

廉价的解决方案是在其中添加SELECT DISTINCT以仅返回不同的记录(这可能会消除复制问题)。然而,这并不总是很好的解决方案

发布返回的记录以及您应该返回的记录,我们可以设法解决它(尽管distinct可能会暂时解决此问题)

编辑:查看结果,您有四条不同的记录。看起来(假设排序与select语句相同)的差异是int eh po.OrderedQty列和po.TotalAmount列

由于您在注释中声明运行查询select*from tblPurchaseOrder,并且只得到2个结果,因此显然是PODetails中的两列导致了附加记录(这对于连接是正确的)

tblPurchaseOrder中有以下内容(截断为一列):

这篇文章的细节如下:

Nokia
Item 1
你会得到:

3
4
真正的问题是,您正在使用的POno作为您的连接,对于您的所有记录来说都是1。这使得我上面演示的结果得以实现,因为每个记录1等于1


这两个表之间没有可以唯一标识所需记录的列。

每个PoNo的podetails表中可能有多行。这就是为什么会有多行

Nokia 3
Item 1 3
Nokia 4
Item 1 4
因此,您还需要使用另一列(POID)进行连接,如下所示:

SELECT * 
FROM PODetails po
WHERE po.PONo = '1';

为了识别所需的记录,您需要一个列或列的组合必须是唯一的


结果是正确的。。。他从订单表中取出第一行,并与podetails相关!在这里,他找到了两行匹配项。然后他从orders中获取第二行,并与Podetals中相同的2行相关,因此他将返回4行

你能添加你得到的结果吗?你有不完整的
JOIN
标准。。ie每个PONo与另一个表中的2个PONo相匹配。请您向我们展示这两个表中的数据,并让我们知道您使用的是什么数据库(SQL只是查询语言,而不是数据库系统)。请不要将代码样本或样本数据放入注释中-因为您无法格式化它,所以读取它非常困难。。。。取而代之的是:通过编辑你的问题来更新它,以提供额外的信息!谢谢你,我不明白co@NAJEEB请添加一些列标题,以便我们知道数据代表什么。您显示的数据似乎是四条不同的记录。为了帮助您,我们还需要知道每个表有哪些不同的列,这可能是最糟糕的事情case@HLGEM这就是为什么我要datayea。它应该是2条记录,而不是4条。@NAJEEB请尝试上面的查询MSG 2714,16级,状态6,第2行。数据库中已经有一个名为“tblPurchaseOrder”的对象。Msg 2714,级别16,状态4,第2行数据库中已存在名为“FK_tblPurchaseOrder_tblPurchaseOrder”的对象。Msg 1750,级别16,状态0,第2行无法创建约束。请参阅前面的错误。Msg 207,级别16,状态1,第14行无效列名“PODId”。在这种情况下,Distinct可能是最糟糕的做法。此查询不会返回他想要的值,它将只返回一个record@MarshallTigerus是的,OP只想要一张唱片。请查看更新的问题。从PODetails po中选择*,其中po.PONo='1';在代码中,显示正确的answer@JosephB我看不到他想要一张唱片的地方。我看到“我有两行代码要显示,当我运行它时,它返回4行,2个原始行和2个副本(与前2行相同)实际答案只有两行”@MarshallTigerus请看“我只需要Podetals表中的一行。但令人困惑的是,为什么它只显示4行,return.”接近结尾。
SELECT * 
FROM PODetails po
WHERE po.PONo = '1';
SELECT p.*, po.OrderedQty, po.TotalAmount 
FROM tblPurchaseOrder  AS p
INNER JOIN PODetails  AS po ON p.PONo = po.PONo AND po.PODID = p.POID
WHERE po.PONo = '1';