Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不使用左联接的左联接与3个表_Sql_Sql Server_Join_Left Join_Inner Join - Fatal编程技术网

Sql 不使用左联接的左联接与3个表

Sql 不使用左联接的左联接与3个表,sql,sql-server,join,left-join,inner-join,Sql,Sql Server,Join,Left Join,Inner Join,我必须用左连接从3个表中获取所有数据。我在使用和不使用左连接时都这么做了。但我的老师提出了另一个解决方案,只使用内部连接。我就是找不到解决办法,请给我一些建议。以下是表格: 结果应该是这样的: 使用左连接解决方案: SELECT O.*,C.CUST_CODE,C.CUST_NAME,P.PART_CODE,P.PART_NAME FROM ORDERS O LEFT OUTER JOIN PART P ON P.PART_ID = O.PART_ID LEFT OUTER JOIN CUST

我必须用左连接从3个表中获取所有数据。我在使用和不使用左连接时都这么做了。但我的老师提出了另一个解决方案,只使用内部连接。我就是找不到解决办法,请给我一些建议。以下是表格:

结果应该是这样的:

使用左连接解决方案:

SELECT O.*,C.CUST_CODE,C.CUST_NAME,P.PART_CODE,P.PART_NAME 
FROM ORDERS O
LEFT OUTER JOIN PART P ON P.PART_ID = O.PART_ID
LEFT OUTER JOIN CUSTOMER C ON C.CUST_ID = O.CUST_ID
SELECT O.*,
(SELECT C.CUST_CODE FROM CUSTOMER C WHERE C.CUST_ID=O.CUST_ID) AS CUST_CODE,
(SELECT C.CUST_NAME FROM CUSTOMER C WHERE C.CUST_ID=O.CUST_ID) AS CUST_NAME,
(SELECT P.PART_CODE FROM PART P WHERE P.PART_ID = O.PART_ID ) AS PART_CODE,
(SELECT P.PART_NAME FROM PART P WHERE P.PART_ID = O.PART_ID ) AS PART_NAME
FROM ORDERS O
没有左连接解决方案:

SELECT O.*,C.CUST_CODE,C.CUST_NAME,P.PART_CODE,P.PART_NAME 
FROM ORDERS O
LEFT OUTER JOIN PART P ON P.PART_ID = O.PART_ID
LEFT OUTER JOIN CUSTOMER C ON C.CUST_ID = O.CUST_ID
SELECT O.*,
(SELECT C.CUST_CODE FROM CUSTOMER C WHERE C.CUST_ID=O.CUST_ID) AS CUST_CODE,
(SELECT C.CUST_NAME FROM CUSTOMER C WHERE C.CUST_ID=O.CUST_ID) AS CUST_NAME,
(SELECT P.PART_CODE FROM PART P WHERE P.PART_ID = O.PART_ID ) AS PART_CODE,
(SELECT P.PART_NAME FROM PART P WHERE P.PART_ID = O.PART_ID ) AS PART_NAME
FROM ORDERS O

这里有一种方法只使用内部联接,而不在任何地方使用左联接。它从使用内部联接而不是左联接的原始查询开始,然后将获取所有表的内积所缺少的部分添加到该结果集中

SELECT t.* FROM
(
    SELECT O.ORDER_ID, O.ORDER_DATE, C.CUST_CODE, C.CUST_NAME, P.PART_CODE, P.PART_NAME 
    FROM ORDERS O
    INNER JOIN PART P
        ON P.PART_ID = O.PART_ID
    INNER JOIN CUSTOMER C
        ON C.CUST_ID = O.CUST_ID
    UNION
    SELECT O.ORDER_ID, O.ORDER_DATE, NULL AS CUST_CODE, NULL AS CUST_NAME, P.PART_CODE,
        P.PART_NAME 
    FROM ORDERS O
    INNER JOIN PART P
        ON P.PART_ID = O.PART_ID
    WHERE O.CUST_ID NOT IN (SELECT C.CUST_ID FROM CUSTOMER C)
        OR O.CUST_ID IS NULL
    UNION
    SELECT O.ORDER_ID, O.ORDER_DATE, C.CUST_CODE, C.CUST_NAME, NULL AS PART_CODE,
        NULL AS PART_NAME 
    FROM ORDERS O
    INNER JOIN CUSTOMER C
        ON C.CUST_ID = O.CUST_ID
    WHERE O.PART_ID NOT IN (SELECT P.PART_ID FROM PART P)
        OR O.PART_ID IS NULL
    UNION
    SELECT O.ORDER_ID, O.ORDER_DATE, NULL AS CUST_CODE, NULL AS CUST_NAME,
        NULL AS PART_CODE, NULL AS PART_NAME
    FROM ORDERS O
    WHERE (O.CUST_ID NOT IN (SELECT C.CUST_ID FROM CUSTOMER C) AND
           O.PART_ID NOT IN (SELECT P.PART_ID FROM PART P)) OR
           (O.CUST_ID IS NULL AND O.PART_ID IS NULL)
) t
ORDER BY t.ORDER_ID ASC
请按照以下链接进行演示:


这在现实生活中毫无意义,但我理解这在SQL课程中是有意义的。你有一位好老师

像这样试试

SELECT * FROM
(   
    SELECT O.*,C.CUST_CODE,C.CUST_NAME,P.PART_CODE,P.PART_NAME 
    FROM ORDERS O
    INNER JOIN PART P ON P.PART_ID = O.PART_ID
    INNER JOIN CUSTOMER C ON C.CUST_ID = O.CUST_ID

    UNION

    SELECT O.*,NULL,NULL,P.PART_CODE,P.PART_NAME 
    FROM ORDERS O
    INNER JOIN PART P ON P.PART_ID = O.PART_ID
    WHERE O.CUST_ID IS NULL

    UNION

    SELECT O.*,C.CUST_CODE,C.CUST_NAME,NULL, NULL
    FROM ORDERS O
    INNER JOIN CUSTOMER C ON C.CUST_ID = O.CUST_ID
    WHERE O.PART_ID IS NULL

    UNION

    SELECT O.*,NULL,NULL,NULL, NULL
    FROM ORDERS O
    WHERE O.PART_ID IS NULL AND O.CUST_ID IS NULL   

)   T

ORDER BY ORDER_ID

使用内部联接无法获得该结果。这是因为您的一些订单包含客户或零件的空值。你100%确定你的老师说了“内部连接”吗?这个链接应该可以帮助你解决问题@SQLGeorge没有左连接的情况下有很多方法可以做到这一点。这就是我相信OP所要求的。@TimBiegeleisen是的,但他特别要求内部联接。@SQLGeorge是的,他希望我们只使用内部联接先生,然后第一个联接就是左联接本身的答案。我不明白你在这里干了什么?“对不起,我的英语不好。”马丁史密斯一开始问他原来的问题,然后修改它以得到答案。我忘了删除左边的连接。哦,天哪……是时候用提琴了,它只返回5行。应该是9排谢谢。我必须提到的是,他说只要一个SELECT语句就可以做到这一点。我不知道该怎么做:是的,他是最好的:我在发布时遗漏了一些东西,30秒后我编辑了它。你试过最新版本吗?什么不起作用呢?不,sorryMsg 156,15级,状态1,第23行关键字“ORDER”附近的语法不正确;对不起,还是不行。我想我们不能从Msg 102,15级,状态1,第21行写入SELECT,语法不正确。