SQL 连接子查询

Posted

技术标签:

【中文标题】SQL 连接子查询【英文标题】:SQL join subquery 【发布时间】:2013-09-14 03:14:32 【问题描述】:

我尝试为我的问题寻找答案,但未能找到真正有帮助的答案。 我已经写了一个 sql 代码,但似乎无法找到问题所在。 是否可以在“FROM”部分放置子查询?

SELECT S2.ITEM,
       S1.SHOP_ORDER,
       S1.OPERATION_NO,
       S1.START_DATE,
       S1.QTY_GOODS,
       S1.QTY_ENTERED,
       S1.QTY_MRB
FROM   (SELECT SHOP_ORD_RPT.OPERATION_NO,
               SHOP_ORD_RPT.SHOP_ORDER
        FROM   FLAME.SHOP_ORD_RPT
        WHERE  SHOP_ORD_RPT.OPERATION_NO = 110
                OR SHOP_ORD_RPT.OPERATION_NO = 370) AS S1
       JOIN (SELECT SHOP_ORD.SHOP_ORDER
             FROM   FLAME.SHOP_ORD
             WHERE  SHOP_ORD.ITEM = '3A2375'
                     OR SHOP_ORD.ITEM = '3A2703')AS S2
         ON S1.SHOP_ORDER = S2.SHOP_ORDER; 

我在运行脚本时收到的错误是:

SQL 命令未正确结束

如果有人能提供帮助,我将不胜感激。 非常感谢- 露丝

【问题讨论】:

删除AS S1AS S2 中的“AS”。 SQL Command not properly ended? 的可能重复项 我认为这是甲骨文。这是我最不喜欢的错误信息之一。您在某处有语法错误。在每个子查询中为 shop_order 列放置别名可能值得一试。否则,请重新开始并逐步执行,直到找到错误为止。 这里不需要子查询——只需在主查询本身中加入表即可。 @DanBracuk 为什么给这些列加上别名会有帮助?您没有查看可能的重复链接并发现它是同一个问题吗? @MartinSmith,认为某事值得一试并不等于认为它会起作用。就您的链接而言,我在发布我的链接后第一次看到您的评论。我打字很慢。 【参考方案1】:

尝试在FROMJOIN 子查询之后删除AS keywrod,如下所示

SELECT S2.ITEM, S1.SHOP_ORDER, S1.OPERATION_NO, S1.START_DATE,S1.QTY_GOODS, S1.QTY_ENTERED, S1.QTY_MRB
FROM (
    SELECT SHOP_ORD_RPT.OPERATION_NO, SHOP_ORD_RPT.SHOP_ORDER
    FROM FLAME.SHOP_ORD_RPT
    WHERE SHOP_ORD_RPT.OPERATION_NO =110
    OR SHOP_ORD_RPT.OPERATION_NO =370
    )  S1
JOIN (
    SELECT SHOP_ORD.SHOP_ORDER
    FROM FLAME.SHOP_ORD
    WHERE SHOP_ORD.ITEM ='3A2375'
    OR SHOP_ORD.ITEM ='3A2703'
    )  S2
ON S1.SHOP_ORDER = S2.SHOP_ORDER;

【讨论】:

【参考方案2】:

可以在 from 子句中放置子查询。试试这个:

SELECT S2.ITEM,
       S1.SHOP_ORDER,
       S1.OPERATION_NO,
       S1.START_DATE,
       S1.QTY_GOODS,
       S1.QTY_ENTERED,
       S1.QTY_MRB
FROM   (SELECT SHOP_ORD_RPT.OPERATION_NO,
               SHOP_ORD_RPT.SHOP_ORDER
        FROM   FLAME.SHOP_ORD_RPT
        WHERE  SHOP_ORD_RPT.OPERATION_NO = 110
                OR SHOP_ORD_RPT.OPERATION_NO = 370) S1,
      (SELECT SHOP_ORD.SHOP_ORDER
       FROM   FLAME.SHOP_ORD
       WHERE  SHOP_ORD.ITEM = '3A2375'
               OR SHOP_ORD.ITEM = '3A2703') S2
WHERE S1.SHOP_ORDER = S2.SHOP_ORDER; 

【讨论】:

以上是关于SQL 连接子查询的主要内容,如果未能解决你的问题,请参考以下文章

013.子查询和分页子查询(sql实例)

SQL中,多表连接查询和不相关子查询从查询效率上来说,哪种查询的效果更好?为啥 ?

SQL 连接与 SQL 子查询(性能)?

多个连接子查询 SQL Server 2008

MySql子查询(wherefromexists)及连接查询(left joinright joininner joinunion join)

SQL 子查询,连接查询复习