sql выполнить 3 естественное соединение, затем объединение, затем вместе - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу естественное объединение 3 раза (Product - инвентарь), затем объединить их вместе, но следующее не работает с ошибкой near "(": syntax error: (, я хочу увидеть model и price всех подходящих предметов.

    (SELECT model, price FROM PC) NATURAL JOIN (SELECT model FROM Product WHERE maker='B')

    UNION

    (SELECT model, price FROM Laptop) NATURAL JOIN (SELECT model FROM Product WHERE maker='B')

    UNION

    (SELECT model, price FROM Printer) NATURAL JOIN (SELECT model FROM Product WHERE maker='B');

Может кто-нибудь помочь?спасибо.

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

А как насчет объединения трех таблиц, а затем полусоединения с четвертым?:

WITH T AS ( SELECT model, price FROM PC 
            UNION 
            SELECT model, price FROM Laptop 
            UNION 
            SELECT model, price FROM Printer )
SELECT * 
  FROM T 
 WHERE model IN ( SELECT model FROM Product WHERE maker = 'B' );
0 голосов
/ 01 февраля 2019

Вы можете написать свой запрос, как показано ниже

select
model, price from (SELECT model, price FROM PC) a1 JOIN 
(SELECT model FROM Product WHERE maker='B') a on a1.model=a.model 

union
 select model, price from
(SELECT model, price FROM Laptop) b1
JOIN (SELECT model FROM Product WHERE maker='B') b on b1.model =b.model 
UNION
 select model, price from
(SELECT model, price FROM Printer) c1 JOIN
(SELECT model FROM Product WHERE maker='B') c on c1.model=c.model
0 голосов
/ 01 февраля 2019

JOIN (и его варианты) являются операторами в предложении FROM.Так что ваши запросы просто не имеют смысла.Вы используете оператор вне предложения SQL, где это имеет смысл.

Каждый запрос может записываться как:

select model, price
from (SELECT model, price FROM PC) p NATURAL JOIN
     (SELECT model FROM Product WHERE maker ='B') b;

Однако я считаю NATURAL JOINмерзость, потому что она сопоставляет столбцы по именам , а не по явным отношениям внешнего ключа.Это использование немного лучше, чем в большинстве случаев.Код явно выбирает столбцы, поэтому код изолирован от «неожиданных» столбцов, которые портят логику.

Однако, на мой взгляд, это проще и понятнее:

select p.model, p.price
from pc p join
     product pr
     on p.model = pr.mode
where pr.maker = 'B';

Иexists может быть еще яснее:

select p.model, p.price
from pc p join
where exists (select 1
              from product pr
              where p.model = pr.model and pr.maker = 'B'
             );
0 голосов
/ 01 февраля 2019

Возможно, у вас слишком много () и отсутствует псевдоним таблицы

SELECT model, price 
FROM PC  
NATURAL JOIN ( SELECT model FROM Product WHERE maker='B') t1

UNION

SELECT model, price 
FROM Laptot 
NATURAL JOIN (SELECT model FROM Product WHERE maker='B') t2

UNION

SELECT model, price 
FROM Printer 
NATURAL JOIN (SELECT model FROM Product WHERE maker='B') t3;

Если вы вместо естественного объединения хотите использовать внутреннее объединение, вы можете видеть, что имя таблицы alais используется для правильной идентификацииотносящиеся к столбцу e:

SELECT model, price 
FROM Printer 
INNER JOIN ( 
  SELECT model FROM Product WHERE maker='B'
) t3 on t3.model = printer.model ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...