Показать столбец из нескольких таблиц - PullRequest
2 голосов
/ 13 марта 2019

Итак, у меня есть 4 таблицы и несколько дублирующих столбцов, и я хочу выбрать столбцы из каждой таблицы и отобразить каждый столбец из 4 таблиц.

системный стол

+------+-------+----------+-------+
| reg  |   ic  |    plate |  type |
+------+-------+----------+-------+
| 1000 | 22222 | WWW123   | car   |
| 1001 | 11111 | BBB987   | truck |
+------+-------+----------+-------+

таблица владельца

+------+-------+
| name |  ic   |
+------+-------+
| john |  2222 |
| joe  |  1111 |
+------+-------+

автомобильный стол

+--------+-------+------+-------+-------+----------+
| plate  | color | year | make  | model | capacity |
+--------+-------+------+-------+-------+----------+
| WWW123 | blue  | 2015 | Honda | City  |      1.5 |
+--------+-------+------+-------+-------+----------+

стол для грузовика

+--------+-------+------+--------+-------+----------+---------+
| plate  | color | year |  make  | model | capacity | maxload |
+--------+-------+------+--------+-------+----------+---------+
| BBB987 | red   | 2018 | Toyota | Hilux |      2.0 |    3000 |
+--------+-------+------+--------+-------+----------+---------+

Допустим, я хочу отобразить все данные следующим образом:

+------+------+-------+--------+-------+------+--------+-------+----------+-------+---------+
| reg  | name |  ic   | plate  | color | year |  make  | model | capacity | type  | maxload |
+------+------+-------+--------+-------+------+--------+-------+----------+-------+---------+
| 1000 | John | 22222 | WWW123 | blue  | 2015 | Honda  | City  |      1.5 | car   |         |
| 1001 | Joe  | 11111 | BBB987 | red   | 2018 | Toyota | Hilux |      2.0 | truck |    3000 |
+------+------+-------+--------+-------+------+--------+-------+----------+-------+---------+

Есть ли какой-нибудь возможный способ генерирования SQL, который делает это?

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Это случай для операторов объединения.Поскольку вы хотите найти пересечение между таблицами, мы будем использовать UNION ALL + внутреннее соединение (выбор значений, совпадающих в нескольких таблицах).

SELECT name, ic, req, plate, year, color, make, model, capacity, maxload 
FROM ((SELECT * FROM car c WHERE c.plate=plate) UNION ALL (SELECT * FROM truck AS t WHERE t.plate=plate))
INNER JOIN owner AS o ON o.ic=ic

Попробуйте выполнить его.Возможно, вам придется указать каждое поле от легкового и грузового автомобиля вместо использования звездочки (*)

/ AF

0 голосов
/ 13 марта 2019

Аналогично другим ответам.Но вот, пожалуйста.

Структура таблицы и данные

 CREATE TABLE systemtbl
  (
     reg   INT,
     ic    INT,
     plate VARCHAR(255),
     type  VARCHAR(255)
  );

CREATE TABLE ownertbl
  (
     name VARCHAR(255),
     ic   INT
  );

CREATE TABLE cartbl
  (
     plate    VARCHAR(255),
     color    VARCHAR(255),
     year     INT,
     make     VARCHAR(255),
     model    VARCHAR(255),
     capacity DECIMAL(2, 1)
  );

CREATE TABLE trucktbl
  (
     plate    VARCHAR(255),
     color    VARCHAR(255),
     year     INT,
     make     VARCHAR(255),
     model    VARCHAR(255),
     capacity DECIMAL(2, 1),
     maxload  INT
  );

INSERT INTO systemtbl
VALUES      (1000, 22222,'WWW123', 'car'),
            (1001, 11111, 'BBB987', 'truck');

INSERT INTO ownertbl
VALUES      ('john', 22222),
            ('joe', 11111);

INSERT INTO cartbl
VALUES      ('WWW123', 'blue', 2015, 'Honda', 'City', 1.5);

INSERT INTO trucktbl
VALUES      ('BBB987', 'red', 2018, 'Toyota', 'Hilux', 2.0, 3000 );  

SQL-запрос

SELECT systemtbl.reg,
       ownertbl.name,
       systemtbl.ic,
       systemtbl.plate,
       systemtbl.type,
       tmp.color,
       tmp.year,
       tmp.make,
       tmp.model,
       tmp.capacity,
       tmp.maxload
FROM   (SELECT plate, color, year, make, model, capacity, NULL AS maxload
        FROM   cartbl
        UNION ALL
        SELECT plate, color, year, make, model, capacity, maxload
        FROM   trucktbl) tmp
       INNER JOIN systemtbl USING (plate)
       INNER JOIN ownertbl USING (ic)

Вывод

+-------+-------+--------+---------+--------+--------+-------+---------+--------+-----------+---------+
| reg   | name  |  ic    | plate   | type   | color  | year  |  make   | model  | capacity  | maxload |
+-------+-------+--------+---------+--------+--------+-------+---------+--------+-----------+---------+
| 1000  | john  | 22222  | WWW123  | car    | blue   | 2015  | Honda   | City   |      1.5  | (null)  |
| 1001  | joe   | 11111  | BBB987  | truck  | red    | 2018  | Toyota  | Hilux  |        2  | 3000    |
+-------+-------+--------+---------+--------+--------+-------+---------+--------+-----------+---------+

Онлайн-демонстрация: http://sqlfiddle.com/#!9/52596e/3/0

0 голосов
/ 13 марта 2019

Вы можете попробовать ниже -

select reg,name,A.ic,A.plate,color,year,make,model,capacity,type,maxload 
from systemtable A
inner join ownertable B on A.ic=B.ic
join
(
select plate, color ,year ,make ,model, capacity,null as maxload from car
union all
select plate, color ,year ,make ,model, capacity,maxload from truck
)C on A.plate=C.plate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...