Почему я получаю бесконечные результаты?разве это не должно показывать мне только 1 клиента? ID_Cliente? - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужен запрос, который принимает ID_Offerta в качестве входных данных и возвращает все Cantieri клиента, который связан с Offerta.вот отношения: https://i.gyazo.com/490cd3085c412b7fcc91317d71705ee3.png

это запрос:

SELECT DISTINCTROW Offerte.ID_offerta, Cantieri.ID_cantiere, Clienti.ID_Cliente
FROM Offerte,
     Cantieri,
     Clienti
WHERE (((Cantieri.ID_Cliente) = (SELECT DISTINCT MAX(Cantieri.ID_Cliente)
                                 FROM Cantieri,
                                      Offerte
                                 WHERE Offerte.ID_Cantiere = Cantieri.ID_Cantiere
                                   AND Offerte.ID_Offerta=[ins])));

и вот что я получаю: https://i.gyazo.com/7526cf11681c3828723e25cd24578c8d.png

спасибо и извините за пиццуи язык мандолино

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Я полагаю, у вас есть декартово произведение между Offerte, Cantieri и Clienti

SELECT DISTINCTROW Offerte.ID_offerta, Cantieri.ID_cantiere, Clienti.ID_Cliente
FROM Offerte,
     Cantieri,
     Clienti
WHERE (((Cantieri.ID_Cliente) = (SELECT DISTINCT MAX(Cantieri.ID_Cliente)
                                 FROM Cantieri,
                                      Offerte
                                 WHERE Offerte.ID_Cantiere = Cantieri.ID_Cantiere
                                   AND Offerte.ID_Offerta=[ins])))
AND Clienti.ID_Cliente = Cantieri.ID_Cliente
AND Offerte.ID_Offerta=[ins]

Но из вашего первоначального описания я бы пошел с этим

SELECT DISTINCT Offerte.ID_offerta, Cantieri.ID_cantiere, Clienti.ID_Cliente
FROM Offerte,
     Cantieri,
     Clienti
WHERE Offerte.ID_Offerta=[ins]
AND Cantieri.ID_Cantiere = Offerte.ID_Cantiere
AND Clienti.ID_Cliente = Cantieri.ID_Cliente
0 голосов
/ 08 апреля 2019

Использование INNER JOIN !!!

SELECT o.ID_offerta, c.ID_cantiere, cl.ID_Cliente
FROM (Offerte as o INNER JOIN
      Cantieri as c
      ON o.ID_Cantiere = c.ID_Cantiere
     ) INNER JOIN
     Clienti as cl
     ON cl.ID_Cliente = c.ID_Cliente
WHERE o.ID_Offerta = [ins];

Я удалил DISTINCT, потому что это, вероятно, не нужно с правильным JOIN. Однако, если это все еще необходимо, включите его.

Вероятно, вы можете еще больше упростить этот запрос, удалив Clienti; единственный используемый столбец уже находится в Cantiere:

SELECT o.ID_offerta, c.ID_cantiere, c.ID_Cliente
FROM Offerte as o INNER JOIN
     Cantieri as c
     ON o.ID_Cantiere = c.ID_Cantiere
WHERE o.ID_Offerta = [ins];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...