内连接,SQL,4个表

时间:2012-01-01 16:07:03

标签: .net sql vb.net

我知道有一些工具可以解决这个问题,但不管怎么说,我无法弄清楚不允许检索记录的错误,尽管有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 & "'"

2 个答案:

答案 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'