我的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 子句指定?
答案 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'