sql server 多对多查询

1、需要实现的效果图

 2、建表SQL

DROP TABLE IF EXISTS #TMP_RNO
DROP TABLE IF EXISTS #TMP1
DROP TABLE IF EXISTS #TMP2
DROP TABLE IF EXISTS #TMP3
/*建表脚本*/
CREATE TABLE #TMP1(AID INT,ARNO INT)
CREATE TABLE #TMP2(BID INT,BRNO INT)
CREATE TABLE #TMP3(CID INT,CRNO INT)

SELECT *
INTO #TMP_RNO
FROM(
    SELECT 1 ID,NUMBER RNO 
    FROM(
        SELECT NUMBER+1 NUMBER FROM master..spt_values where type='P' AND NUMBER<5
    )A
    UNION ALL
    SELECT 2,NUMBER RNO 
    FROM(
        SELECT NUMBER+1 NUMBER FROM master..spt_values where type='P' AND NUMBER<5
    )A
)A WHERE 1=1
/*插入数据*/
INSERT INTO #TMP1(AID,ARNO)
SELECT ID,RNO FROM #TMP_RNO WHERE RNO=1

INSERT INTO #TMP2(BID,BRNO)
SELECT ID,RNO FROM #TMP_RNO

INSERT INTO #TMP3(CID,CRNO)
SELECT ID,RNO FROM #TMP_RNO

3、查询数据如下

4、使用FULL OUTER JOIN 连接

4.1、不加任何排序如下(两个表连接的情况) 

    SELECT *
    FROM #TMP1 A FULL OUTER JOIN #TMP2 B ON A.AID=B.BID AND A.ARNO=B.BRNO

 

4.2、不加任何排序如下(三个表连接的情况)

    SELECT *
    FROM #TMP1 A FULL OUTER JOIN #TMP2 B ON A.AID=B.BID AND A.ARNO=B.BRNO
    FULL OUTER JOIN #TMP3 C ON (C.CID=A.AID OR C.CID=B.BID) AND (C.CRNO=A.ARNO OR C.CRNO=B.BRNO)

 

4.3、加任何排序如下(两个表连接的情况)

        SELECT *
        FROM #TMP1 A FULL OUTER JOIN #TMP2 B ON A.AID=B.BID AND A.ARNO=B.BRNO
    ORDER BY ISNULL(A.AID,B.BID),ISNULL(A.ARNO,B.BRNO)    

 

4.4、加任何排序如下(三个表连接的情况)

SELECT *
    FROM #TMP1 A FULL OUTER JOIN #TMP2 B ON A.AID=B.BID AND A.ARNO=B.BRNO
    FULL OUTER JOIN #TMP3 C ON (C.CID=A.AID OR C.CID=B.BID) AND (C.CRNO=A.ARNO OR C.CRNO=B.BRNO)
    ORDER BY ISNULL(ISNULL(A.AID,B.BID),C.CID),ISNULL(ISNULL(A.ARNO,B.BRNO),C.CRNO)

需求是 多对多的查询关系,没有硬性的要求某一个表的行数,可多可少(每个key值对应的数据行数),排序是重点在这个查询结果中,没有排序就实现不了想要的效果 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值