【问题标题】:Selecting data from joined tables in one-to-one relationship从一对一关系中的联接表中选择数据
【发布时间】:2018-11-10 23:18:24
【问题描述】:

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

这是家具类。

public abstract class Furniture {

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

}

这是Dresser类。

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)
)

我需要构建一个查询,允许我选择一条记录或从表中选择所有记录,但到目前为止我已经想出了这个,但我不知道这是否一定是最好的方法。

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。

【问题讨论】:

  • 请不要使用旧的基于逗号的隐式连接并使用现代Explicit Join based syntax
  • 另外,请将一些示例数据(在两个表中)添加到问题中,以及相应的预期输出。编辑问题后在此处标记我们。

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


【解决方案1】:

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

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)。

【讨论】:

    【解决方案2】:

    我强烈建议在笛卡尔积上使用INNER JOIN 或与WHERE 子句中的连接交叉连接。

    例如:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果你真的想选择所有条记录(“我的查询选择所有记录”),那么 你想要一个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 就可以了。

        【讨论】:

        • 如果我要从桌子家具中选择所有记录,当然我只想选择那些是梳妆台的记录。还有架子、桌子和其他类型的家具,但我还没有实现。
        • @ShadowGeist 。 . .您的问题是“选择所有记录”,这就是我回答的原因。
        • 你认为完全连接也可以完成同样的事情吗?
        • @ShadowGeist 。 . .如果您只想要梳妆台,请使用inner join(在其他答案中也建议使用)。如果您想要所有家具,并在适当的时候添加额外的dresser 列,请使用left join
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2021-09-18
        相关资源
        最近更新 更多