即使不满足条件,如何将列值包含为null?

gopyfrb3  于 2021-08-13  发布在  Java
关注(0)|答案(3)|浏览(314)

编写一个查询以显示所有没有后付费电表的建筑物的所有建筑物名称、它们的计量公司名称和电表类型。
图1是我应该得到的结果,图2是我得到的结果:

USE Ultimate_DataBase
GO

SELECT [Bld_Name], [Elec_company_name], [Mtype_Name]
FROM [dbo].[Metering_Company] A
FULL OUTER JOIN [dbo].[Metering_Type] D
ON A.[MType_ID]= D.MType_ID
FULL OUTER JOIN [dbo].[Building_metering] B
ON A.[Elec_ID]= B.[Elec_ID]
FULL OUTER JOIN [dbo].[Building] C
ON C.[Bld_ID]= B.[Bld_ID]
WHERE [Mtype_Name] != 'POSTPAID'
yrefmtwq

yrefmtwq1#

试着移动 WHERE 对应的逻辑 ON 条款:

SELECT [Bld_Name], [Elec_company_name], [Mtype_Name]
FROM [dbo].[Metering_Company] A
FULL OUTER JOIN [dbo].[Metering_Type] D
    ON A.[MType_ID]= D.MType_ID AND
       [Mtype_Name] != 'POSTPAID'              -- change is here
FULL OUTER JOIN [dbo].[Building_metering] B
    ON A.[Elec_ID]= B.[Elec_ID]
FULL OUTER JOIN [dbo].[Building] C
    ON C.[Bld_ID]= B.[Bld_ID];

注意:请在select子句中添加别名。它们不是强制性的,假设没有两个表有同名的列,但是只要有别名就可以让您的问题更容易回答。

nhaq1z21

nhaq1z212#

FULL JOIN 似乎没有必要——事实上 FULL JOIN 几乎从不需要,尤其是日常生活中 JOIN 在一个结构良好的数据库中。
问题的结构表明 NOT EXISTS :

SELECT b.*
FROM dbo.Building b
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.Building_metering bm JOIN
                       dbo.Metering_Company mc
                       ON bm.Elec_ID = mc.Elec_ID JOIN
                       dbo.Metering_Type mt
                       ON mt.MType_ID = mc.MType_ID
                  WHERE bm.Bld_ID = b.Bld_ID AND mt.Mtype_Name = 'POSTPAID' 
                 );

你也可以用 LEFT JOIN 和过滤:

SELECT b.*
FROM dbo.Building b LEFT JOIN
     dbo.Building_metering bm 
     ON bm.Bld_ID = b.Bld_ID LEFT JOIN
     dbo.Metering_Company mc
     ON bm.Elec_ID = mc.Elec_ID LEFT JOIN
     dbo.Metering_Type mt
     ON mt.MType_ID = mc.MType_ID AND
        mt.Mtype_Name = 'POSTPAID' 
WHERE mt.MType_ID IS NULL;

这允许您从任何表中选择列。
笔记: FULL JOIN 几乎不需要。
使用有意义的表别名!武断的字母毫无意义。使用表格缩写。
用方括号转义列名和表名只会使代码更难编写和读取。

ikfrs5lh

ikfrs5lh3#

USE Ultimate_DataBase
GO

SELECT [Bld_Name], [Elec_company_name], [Mtype_Name]
FROM [dbo].[Metering_Company] A
LEFT JOIN [dbo].[Metering_Type] D
ON A.[MType_ID]= D.MType_ID
LEFT JOIN [dbo].[Building_metering] B
ON A.[Elec_ID]= B.[Elec_ID]
LEFT JOIN [dbo].[Building] C
ON C.[Bld_ID]= B.[Bld_ID]

用这个

相关问题