以一对一关系从联接表中选择数据

时间:2018-11-10 23:18:25

标签: java mysql sql jdbc one-to-many

我有一个Dresser类,它扩展了抽象类Furniture。

这是家具类。

public abstract class Furniture {

    private String furnishing;
    private String board;
    private String wood;
    private double mass;
    private int price;
    private int shippingPrice;

}

这是课堂梳妆台。

public final class Dresser extends Furniture {

    private int width;
    private int length;
    private int height;
    private int drawers;

}

继承在表中表示如下:

CREATE TABLE furnitures (
    index INTEGER NOT NULL AUTO_INCREMENT,
    furnishing VARCHAR(255) NOT NULL,
    board VARCHAR(255) NOT NULL,
    wood VARCHAR(255) NOT NULL,
    mass FLOAT(5,2) NOT NULL,
    price INTEGER NOT NULL,
    shipping_price INTEGER NOT NULL,
    PRIMARY KEY (index)
)

CREATE TABLE IF NOT EXISTS dressers (
    index INTEGER NOT NULL,
    width INTEGER NOT NULL,
    length INTEGER NOT NULL,
    height INTEGER NOT NULL,
    drawers INTEGER NOT NULL,
    PRIMARY KEY (index),
    FOREIGN KEY (index) REFERENCES furniture (index)
)

我需要构建一个查询,使我可以选择一个记录或从表中选择所有记录,但是到目前为止,我已经提出了这个建议,但是我不知道这是否一定是最好的方法。 / p>

String query =
"SELECT furniture.board, furniture.wood, furniture.mass, " +
"furniture.price, furniture.shipping_price, " +
"dresser.width, dresser.length, dresser.height, dresser.drawers " +
"FROM furniture, dresser " +
"WHERE " +
"furniture.index = dresser.index";

这是我选择所有记录的查询(可以安全地忽略提供字段)。

该如何改善?另外,如何查询给定特定索引的特定记录或如何更新记录?

PD:我正在使用MySQL。

4 个答案:

答案 0 :(得分:0)

要仅选择特定的梳妆台,请使用

String query =
"SELECT f.board, f.wood, f.mass, f.price, f.shipping_price,    
d.width, d.length, d.height, d.drawers
FROM furniture f
JOIN dresser d ON f.index = d.index
WHERE f.index = @index"

@index是您想要的梳妆台的索引(请参见https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-parameters.html)。

答案 1 :(得分:0)

我强烈建议在笛卡尔积上使用INNER JOIN或通过WHERE子句中的联接进行交叉联接。

例如:

String query = "SELECT * FROM furniture f INNER JOIN dresser d ON f.index = d.index"

答案 2 :(得分:0)

更新必须在两个语句中完成。您可能需要将两个语句包装在transaction中,以确保它们都成功或失败。

答案 3 :(得分:0)

如果您确实要选择所有个记录(“我的查询以选择所有记录”),则 您想要left join,以确保您获得的家具不是梳妆台:

SELECT f.board, f.wood, f.mass, f.price, f.shipping_price,    
       d.width, d.length, d.height, d.drawers
FROM furniture f LEFT JOIN
     dresser d
     ON f.index = d.index
WHERE f.index = @index;

如果您只想要所有梳妆台,那么INNER JOIN很好。