Sql查询返回Where子句未指定的行

时间:2016-09-02 12:53:23

标签: mysql sql-server

我的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 enter image description here

我试过了DISTINCT,但它没有用。

这是我总是得到的输出:

enter image description here

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

2 个答案:

答案 0 :(得分:0)

很可能其中一个内部联接匹配多个行,因此它在输出集中生成两行。使用以下命令运行查询:

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

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

答案 1 :(得分:0)

该集合生成了多行(请记住这是所有集合理论) - 您在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_idtails中的两个行的transaction_id相同 - 它匹配transaction_status中的两行。 SQL将创建4行 - 两行匹配" review"和#34;两行回复" (删除WHERE以查看它们)。这是各种各样的交叉连接。

_status表是否也包含transaction_number?需要有一种方法可以将transaction_details中的单行JOIN连接到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'