【问题标题】:Sql query returns row which was not specified by Where clauseSql 查询返回未由 Where 子句指定的行
【发布时间】:2016-09-02 12:53:22
【问题描述】:

我的 SQL 查询没有返回假定由我的 where 子句指定的输出。

这是我的查询:

SELECT 
    transaction_details.transaction_id
    ,transaction_details.transaction_number
    ,transaction_details.product_id
    ,Products3.ProductName
FROM transaction_details
INNER JOIN Products3
ON transaction_details.product_id = Products3.productID
INNER JOIN transaction_status
ON transaction_details.transaction_id = transaction_status.transaction_id
WHERE status_of_transaction = 'review'

此查询应返回带有status_of_transaction = 'review' 的表行。

这是我的表格,其中包含 status_of_transaction

我尝试了DISTINCT,但它不起作用。

这是我总是得到的输出:

我的查询是否有问题,它返回了我的 WHERE 子句未指定的表行?

【问题讨论】:

  • transaction_number 删除此列,否则您应该使用GROUP BY
  • 如果在SELECT 子句中包含status_of_transaction 会发生什么?结果数据是什么?我怀疑这里可能发生了其他事情,可能与JOINs 的产品有关,而不是WHERE 子句根本不起作用。
  • @NEER 去试试
  • @NEER 这并不能解决问题,它只是掩盖了它。分组数据集中仍在返回附加行。
  • @NEER 你刚才给出的答案工作。但对于像我这样的初学者来说有点难以理解

标签: mysql sql-server


【解决方案1】:

集合生成了多行(请记住,这都是集合理论)- 您在 JOIN 中缺少外键/主键 (FK/PK) 关系。我敢打赌你错过了 INNER JOIN "ON" 语句中的一列。可能需要加入两列才能找到正确的解决方案。

我建议要么逐表挑选,要么使用 select * 并查找每行之间列值的差异。一列应该不同 - 您当前看不到(即隐藏),因为该列不在当前的 SELECT 语句中。

试试这个...

SELECT 
    transaction_status.*
FROM transaction_details
INNER JOIN Products3
ON transaction_details.product_id = Products3.productID
INNER JOIN transaction_status
ON transaction_details.transaction_id = transaction_status.transaction_id
WHERE status_of_transaction = 'review'

我认为问题在于 transaction_status 加入。 transaction_details 中的两行的 transaction_id 相同 - 匹配 transaction_status 中的两行。 SQL 将创建 4 行——两行匹配“review”,两行匹配“replied”(删除 WHERE 以查看它们)。这是一种交叉连接。

_status 表是否也包含 transaction_number?需要有一种方法可以将 transaction_details 中的单行加入 transaction_status 中的单行。不知何故,_status 行属于 _details 行。查看(或询问 DBA)两个表的 PK/FK 定义。

不知道你的架构 - 我猜解决方案是......

SELECT 
transaction_details.transaction_id
,transaction_details.transaction_number
,transaction_details.product_id
,Products3.ProductName
FROM transaction_details
INNER JOIN Products3
ON transaction_details.product_id = Products3.productID
INNER JOIN transaction_status
ON transaction_details.transaction_id = transaction_status.transaction_id
-- ADDED NEXT LINE
  AND transaction_details.transaction_number = transaction_status.transaction_number
-- END Change
WHERE status_of_transaction = 'review'

【讨论】:

  • 很好的解释。这几天前发生在我身上,现在我脑子里有点清楚了。谢谢
【解决方案2】:

很可能其中一个内连接匹配多于一行,因此它在输出集中生成两行。运行查询:

select  transaction_details.transaction_id
,       Products3.product_id
,       transaction_details.detail_id

检查哪个连接是罪魁祸首。

【讨论】:

  • 我试着像你说的那样替换 select 语句。仍然是相同的输出。
  • 是的,更改“选择”部分永远不会更改行。但是您应该能够看到哪个源表导致重复行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多