Выбор данных из объединенных таблиц в соотношении один к одному - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть класс 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)
)

Мне нужно создать запрос, который позволит мне выбрать запись или выбрать все записи из таблицы, но до сих пор я придумал это, но я не знаю, обязательно ли это лучший способ сделать это.

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 голосов
/ 11 ноября 2018

Если вы действительно хотите выбрать все записи («мой запрос, чтобы выбрать все записи»), то Вы хотите 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 подойдет.

0 голосов
/ 11 ноября 2018

Я бы настоятельно рекомендовал использовать INNER JOIN над декартовым произведением или перекрестное соединение с объединением в предложении WHERE.

Например:

String query = "SELECT * FROM furniture f INNER JOIN dresser d ON f.index = d.index"
0 голосов
/ 11 ноября 2018

обновление должно быть сделано в двух утверждениях.Вы, вероятно, захотите заключить два оператора в транзакцию , чтобы убедиться, что оба они успешны или нет.

0 голосов
/ 11 ноября 2018

Чтобы выбрать только определенный комод, используйте

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

...