我知道有一些工具可以解决这个问题,但不管怎么说,我无法弄清楚不允许检索记录的错误,尽管有2个小时的尝试和参考。
任何人都可以帮我吗?我正在使用VS 2008 btw。
SELECT pc.product_category_id, pc.product_category_name,
pi.product_image_id, pi.product_image_filename,
qr.qrcode_id, qr.qrcode_code, *
FROM Product AS p
INNER JOIN ProductCategory AS pc ON p.product_category_id = pc.product_category_id
INNER JOIN ProductImage AS pi ON p.product_image_id = pi.product_image_id
INNER JOIN QRCode AS qr ON p.qrcode_id = qr.qrcode_id
WHERE p.product_id = '" & DropDownList2.Text & "'"
答案 0 :(得分:0)
首先,手动检查您要获取和加入的记录是否存在......
SELECT * FROM Product WHERE product_id = <insert a value here by hand>
SELECT * FROM ProductCategory WHERE product_category_id = <value from the first SELECT>
SELECT * FROM ProductImage WHERE product_image_id = <value from the first SELECT>
SELECT * FROM QRCode WHERE qrcode_id = <value from the first SELECT>
如果您获得所有这些记录,那么您可以确定您的联接正在运行。如果没有,你是否缺少记录,或者需要使用LEFT JOIN?
所以你的下一次检查应该是你正确的值传递给你的SQL查询......
myCmd.CommandText = "SELECT '" & DropDownList2.Text & "'"
您是否还确定ID周围需要'
?这表示字符串,ID更多通常是整数。
最后,查看参数化查询,而不是手动构建字符串。
答案 1 :(得分:0)
由于内部联接,您的查询将仅返回具有类别,图像和qrcode的产品。如果产品表中的这些列可以为null,则必须使用LEFT OUTER JOIN
(通常简写为LEFT JOIN
)。此外,您应该使用p.*
,而不仅仅是*
,因为这会返回所有可用列。返回像pc.product_category_id
这样的ID是没有意义的,因为'p。*'已经返回了相同的值。
SELECT
p.*,
pc.product_category_name,
pi.product_image_filename,
qr.qrcode_code
FROM
Product AS p
LEFT JOIN ProductCategory AS pc
ON p.product_category_id = pc.product_category_id
LEFT JOIN ProductImage AS pi
ON p.product_image_id = pi.product_image_id
LEFT JOIN QRCode AS qr
ON p.qrcode_id = qr.qrcode_id
WHERE
p.product_id = 'xxx'