1

Тема: Створення таблиці з подібними полями

Добрий вечір!

Порадьте як краще вирішити проблему при створені таблиць.

є таблиця worldcoins
з полями:
worldcoins_id
...
material_id
metal_id
sample_id
weight
ozt(Тр.унція)

планую ще додати аналогічні поля для біметалевих монет.

Підскажіть як правилніше??
вцій самій таблиці додати поля

для центру
material_id_center
metal_id_center
sample_id_center
weight_center
ozt_center(Тр.унція)

та для краю
material_id_ring
metal_id_ring
sample_id_ring
weight_ring
ozt_ring(Тр.унція)

Чи створити нову таблицю
coinsparameter з полями:
coinsparameter_id
material_id
metal_id
sample_id
weight
ozt(Тр.унція)

а в табці worldcoins створити поля
coinsparameter_id
coinsparameter_id_center
coinsparameter_id_ring
і ці поля повязати зі створеною таблицею.

2

Re: Створення таблиці з подібними полями

Варіант з окремою таблицею це більш вірний реляційний підхід, бо фізичний склад монети стає сутністю яку кверяємо багато разів. Зараз дуже коротко бо з довгої дороги, зможемо розглянути приклад схеми пізніше.

3 Востаннє редагувалося Romanvolja (19.04.2026 22:02:59)

Re: Створення таблиці з подібними полями

Зробив по другому варіанту але при виведенні запиту не знаю як уникнути конфлікту бо поле таблиці

coinsparameter_id одне  а в запиті більше варіантів.

Для усієї вибірку зробив а як вибрати ще для центру чи краю в одному запиті не можу зрозуміти.


  with qrSelectAllTables do
    begin
      Prepared;
      with SQL do
        begin
          Clear;
          Add(
            'SELECT'+
              ' worldcoins.worldcoins_id'+
              ', coin.coin_name'+
              ', worldcoins.topic'+  
             ....
              ', material.material_name'+
              ', metal.metal_name'+
              ', sample.sample_name'+
              ', coinparameter.weight'+
              ', coinparameter.ozt'+
             ....
       {як далі зробити не можу збагнути }
              {
              ', material_id_center'+
              ', metal_id_center'+
              ', sample_id_center'+
              ', weight_center'+
              ', ozt_center'+
              }

              );
          Add(
            'FROM ((((((((((   (((((   ((((('+
              ' worldcoins'+
              ' LEFT JOIN coin ON worldcoins.coin_id=coin.coin_id)'+
              ' LEFT JOIN country ON worldcoins.country_id=country.country_id)'+
              .....
              ' LEFT JOIN structure ON worldcoins.structure_id=structure.structure_id)'+
              ' LEFT JOIN coinparameter ON worldcoins.coinparameter_id=coinparameter.coinparameter_id)'+

              ' LEFT JOIN material ON coinparameter.material_id=material.material_id)'+
              ' LEFT JOIN metal ON coinparameter.metal_id=metal.metal_id)'+
              ' LEFT JOIN sample ON coinparameter.sample_id=sample.sample_id'
              );
        end;

4

Re: Створення таблиці з подібними полями

Роблю через AS почало дещо виходити.

5

Re: Створення таблиці з подібними полями

Допоможіть вирішити питання з умовами фільтрації

Дві таблиці worldcoins та worldcoins_coinparameter зв'язок між ними багато до багатьох.

потрібно з таблиці worldcoins вивести всі дані,
а з таблиці worldcoins_coinparameter вивести  можливі варіанти але в один рядок і в різні поля.

 begin
      Prepared;
      with SQL do
        begin
          Clear;
          Add(
            'SELECT'+
              ' worldcoins.worldcoins_id'+
              .....
              ', structure.structure_name'+

              ', material_all.material_name AS material_name_all'+
              ', metal_all.metal_name AS metal_name_all'+
              ', sample_all.sample_name AS sample_name_all'+
              ', wc_cp_all.weight AS weight_all'+
              ', wc_cp_all.ozt AS ozt_all'+

              ', material_center.material_name AS material_name_center'+
              ', metal_center.metal_name AS metal_name_center'+
              ', sample_center.sample_name AS sample_name_center'+
              ', wc_cp_center.weight AS weight_center'+
              ', wc_cp_center.ozt AS ozt_center'+  

              ', material_ring.material_name AS material_name_ring'+
              ', metal_ring.metal_name AS metal_name_ring'+
              ', sample_ring.sample_name AS sample_name_ring'+
              ', wc_cp_ring.weight AS weight_ring'+
              ', wc_cp_ring.ozt AS ozt_ring'+
              .....
              ' '
              );
          Add(
            'FROM (((((((((('+
            '((((((('+// denomination ... structure
            '(((( (((( ((('+// worldcoins_coinparameter ... sample(x3)
              ' worldcoins'+
              ....
              ' LEFT JOIN structure ON worldcoins.structure_id=structure.structure_id)'+

              ' LEFT JOIN worldcoins_coinparameter AS wc_cp_all ON worldcoins.worldcoins_id=wc_cp_all.worldcoins_id)'+
              ' LEFT JOIN material AS material_all ON wc_cp_all.material_id=material_all.material_id)'+
              ' LEFT JOIN metal AS metal_all ON wc_cp_all.metal_id=metal_all.metal_id)'+
              ' LEFT JOIN sample AS sample_all ON wc_cp_all.sample_id=sample_all.sample_id)'+

              ' LEFT JOIN worldcoins_coinparameter AS wc_cp_center ON worldcoins.worldcoins_id=wc_cp_center.worldcoins_id)'+
              ' LEFT JOIN material AS material_center ON wc_cp_center.material_id=material_center.material_id)'+
              ' LEFT JOIN metal AS metal_center ON wc_cp_center.metal_id=metal_center.metal_id)'+
              ' LEFT JOIN sample AS sample_center ON wc_cp_center.sample_id=sample_center.sample_id)'+

              ' LEFT JOIN worldcoins_coinparameter AS wc_cp_ring ON worldcoins.worldcoins_id=wc_cp_ring.worldcoins_id)'+
              ' LEFT JOIN material AS material_ring ON wc_cp_ring.material_id=material_ring.material_id)'+
              ' LEFT JOIN metal AS metal_ring ON wc_cp_ring.metal_id=metal_ring.metal_id)'+
              ' LEFT JOIN sample AS sample_ring ON wc_cp_ring.sample_id=sample_ring.sample_id'+
              ' '+
             ....
            'WHERE'+
              ' wc_cp_all.coinparameter_id=1 OR'+
              ' wc_cp_center.coinparameter_id=2 OR'+
              ' wc_cp_ring.coinparameter_id=3'+
              ' '

Фільтрувати пробував через умову AND — та при такій умові виводяться не всі дані з таблиці worldcoins
а через умову OR виводяться всі дані + створюються всі можливі варіанти з таблиці worldcoins_coinparameter та виводяться нові рядки.