繁体   English   中英

将SQL重写为JOINS而不是子查询

[英]Rewriting SQL to JOINS instead of subqueries

将这个查询重写为使用联接而不是两个子查询时,遇到了一些麻烦。 如果您知道我的意思,我有个纠结的问题。

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

你能帮我吗? 或提供一些线索/提示。

使用ANSI SQL-92语法(即,使用JOIN和ON子句)重写它,应该更加清楚。

现在,您所有的JOINWHERE子句都混合在一起,因此要查看它们之间的关系并不容易。 子查询不一定是问题。 一旦语法清理干净,这应该变得更加清楚。

通常:

SELECT ed列移至主SELECT语句,将FROM子句移至原始FROM下方的JOIN子句,并将连接条件移至该行。 您的WHERE子句可以保持原样。

就像@RedFilter所说的那样,请使用JOINON子句。 我认为您正在做笛卡尔,但是由于语法我不确定。

例如(我不知道这对您的表结构是否有效,因为您不提供它):

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 ...

重新编写为使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM