SQL中from后两个子查询的连接方式。

**

SQL中from后两个子查询的连接方式

**

正确的:-------------------------------------------------------------------

ALTER PROCEDURE [dbo].[DM_GZBJQYHZ_HYFL]
@BIXNDW_DWJC AS VARCHAR(20),
@SJ AS INT
AS
BEGIN
SELECT  DISTINCT
   CASE 
      WHEN @BIXNDW_DWJC = '省国资委' THEN f.SL 
      ELSE g.SL 
   END AS 数量,
   CASE 
      WHEN @BIXNDW_DWJC = '省国资委' THEN f.HYZD_MC 
      ELSE g.HYZD_MC 
   END AS 行业名称
FROM
   (
      SELECT COUNT(a.SSHY) AS SL, O.HYZD_MC AS HYZD_MC
      FROM (
         SELECT SUBSTRING(QYJCXX_SSHY, 1, 4) AS SSHY
         FROM DM_GZBJQYHZ
         WHERE YEAR(QYJCXX_CLSJ) >= 1958 AND YEAR(QYJCXX_CLSJ) <= @SJ
      ) a
      LEFT JOIN ODS_ZHJC_ZBYZ_CQBD_JQHYZD O ON O.HYZD_BH = a.SSHY
      GROUP BY O.HYZD_MC
   ) AS f
   FULL OUTER JOIN 
   (
      SELECT  COUNT(a.SSHY) AS SL, OD.HYZD_MC AS HYZD_MC
      FROM (
         SELECT SUBSTRING(QYJCXX_SSHY, 1, 4) AS SSHY
         FROM DM_GZBJQYHZ D
         INNER JOIN ODS_BIXNDW_DWJC p ON D.name = p.BIXNDW_DWMC and p.BIXNDW_DWJC = @BIXNDW_DWJC 
         WHERE  YEAR(QYJCXX_CLSJ) >= 1958 AND YEAR(QYJCXX_CLSJ) <= @SJ
      ) a
      LEFT JOIN ODS_ZHJC_ZBYZ_CQBD_JQHYZD OD ON OD.HYZD_BH = a.SSHY
      GROUP BY OD.HYZD_MC
   ) AS g ON 1=1   -- This join condition is just to have a join condition, you might need to adjust it based on your actual requirement
ORDER BY 数量 DESC
END

错误的:------------------------------------------------------------------

ALTER PROCEDURE [dbo].[DM_GZBJQYHZ_HYFL] @BIXNDW_DWJC AS VARCHAR ( 20 ), @SJ AS INT AS BEGIN
	SELECT DISTINCT
	CASE
			
		WHEN
			@BIXNDW_DWJC = '省国资委' THEN
				f.SL ELSE g.SL 
				END AS 数量,
		CASE
				
				WHEN @BIXNDW_DWJC = '省国资委' THEN
				f.HYZD_MC ELSE g.HYZD_MC 
			END AS 行业名称 
		FROM
			(
			SELECT COUNT
				( a.SSHY ) AS SL,
				O.HYZD_MC AS HYZD_MC 
			FROM
				(
				SELECT SUBSTRING
					( QYJCXX_SSHY, 1, 4 ) AS SSHY 
				FROM
					DM_GZBJQYHZ 
				WHERE
					YEAR ( QYJCXX_CLSJ ) >= 1958 
					AND YEAR ( QYJCXX_CLSJ ) <= @SJ 
				) a
				LEFT JOIN ODS_ZHJC_ZBYZ_CQBD_JQHYZD O ON O.HYZD_BH = a.SSHY 
			GROUP BY
				O.HYZD_MC 
			) AS f,----这个地方
			(
			SELECT COUNT
				( a.SSHY ) AS SL,
				OD.HYZD_MC AS HYZD_MC 
			FROM
				(
				SELECT SUBSTRING
					( QYJCXX_SSHY, 1, 4 ) AS SSHY 
				FROM
					DM_GZBJQYHZ D
					INNER JOIN ODS_BIXNDW_DWJC p ON D.name = p.BIXNDW_DWMC 
					AND p.BIXNDW_DWJC = @BIXNDW_DWJC 
				WHERE
					YEAR ( QYJCXX_CLSJ ) >= 1958 
					AND YEAR ( QYJCXX_CLSJ ) <= @SJ 
				) a
				LEFT JOIN ODS_ZHJC_ZBYZ_CQBD_JQHYZD OD ON OD.HYZD_BH = a.SSHY 
			GROUP BY
				OD.HYZD_MC 
			) AS g 
		ORDER BY
		数量 DESC 
	END ```

困扰了一天。。。。。。。。。。。。。。。。。。。。。。。。。

当时的矛盾点是:当传参 为 省国资委时 数据出不来,子查询都正确,,错误原因使用逗号,让fg产生了笛卡尔积

经过多次查询,最后在文心遗言中找到了答案,

f与g两个子查询之间“,”,这样连接好像不对,

最后换成了 FULL OUTER JOIN (----)g on 1=1,就好使了,具体原因还要查查。

总结起来,如果在"f"和"g"之间仅使用逗号隔开而没有其他连接条件,查询将返回它们的笛卡尔积,而不是你想要的结果。为了得到正确的结果,你需要使用适当的连接条件来连接这两个表或列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值