Переписать SQL для JOINS вместо подзапросов - PullRequest
0 голосов
/ 10 ноября 2010

У меня проблемы с переписыванием этого запроса с использованием объединений вместо двух подзапросов.У меня проблема с распутыванием, если вы понимаете, о чем я.

SELECT o.order_id, n.title, c.first_name, t1.name, o.product_id,
    (SELECT ttd2.tid FROM term_data ttd2, term_node ttn2 WHERE ttd2.vid = 5 AND ttn2.nid = p.nid AND ttd2.tid=ttn2.tid) AS tid,
    (SELECT ttd4.name FROM term_data ttd4, term_node ttn4 WHERE ttd4.vid = 8 AND ttn4.nid = p.nid AND ttd4.tid=ttn4.tid) AS month
    FROM orders o, products p, node n, customers c, term_data t1, term_node t2
    WHERE o.product_id = p.nid
    AND p.nid = n.nid
    AND o.customer_email = c.customer_email
    AND t2.tid = t1.tid
    AND t1.vid = 6
    AND n.nid = t2.nid

Можете ли вы помочь?Или дать некоторые подсказки / подсказки.

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Перепишите его, используя ANSI SQL-92 синтаксис (т. Е. Используя предложения JOIN и ON), и это должно быть гораздо более понятным.

Прямо сейчас все ваши предложения JOIN и WHERE смешаны вместе, поэтому не легко увидеть отношения.Подзапросы не обязательно являются проблемой;это должно стать более понятным после очистки синтаксиса.

2 голосов
/ 10 ноября 2010

Переписанный для использования ANSI-92 SQL и немного упрощенный для удаления избыточных объединений, ваш запрос должен выглядеть примерно так:

SELECT o.order_id, 
       n.title, 
       c.first_name, 
       tdv6.name, 
       o.product_id,
       tdv5.tid,
       tdv8.name    month
FROM orders o
     join products p           on o.product_id = p.nid
     join node n               on p.nid = n.nid
     join customers c          on o.customer_email = c.customer_email
     join term_node tnv        on n.nid = tn.nid
     join term_data tdv6       on tn.tid = tdv6.tid AND tdv6.vid = 6
     left join term_data tdv5  on tn.tid = tdv5.tid AND tdv5.vid = 5
     left join term_data tdv8  on tn.tid = tdv8.tid AND tdv8.vid = 8
2 голосов
/ 10 ноября 2010

Как правило:

Переместите столбцы SELECT ed до основного оператора SELECT, переместите предложение FROM в положение JOIN ниже исходного FROM, и вашприсоединить условие к этой линии, а также.Ваше WHERE предложение может остаться как есть.

Также, как говорит @RedFilter, используйте предложения JOIN и ON.Я думаю, что вы делаете декартов, но я не уверен из-за синтаксиса.

Например (я не знаю, допустимо ли это для вашей структуры таблицы, так как вы ее не указали):

SELECT o.order_id, n.title, c.first_name, t1.name, o.product_id,ttd2.tid as 'tid', ttd4.name as 'name'
FROM orders o
INNER JOIN products p ON o.product_id = p.nid
INNER JOIN node n ON AND p.nid = n.nid
INNER JOIN customers c ON o.customer_email = c.customer_email
INNER JOIN term_data t1 ON t2.tid = t1.tid
INNER JOIN term_node t2 ON n.nid = t2.nid 
INNER JOIN ...
WHERE n.nid = t2.nid
AND ttd2.vid = 5 
AND ttn2.nid = p.nid 
AND ttd2.tid=ttn2.tid)
AND t1.vid = 6
AND ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...