簡體   English   中英

即使不滿足條件,如何將列值包含為 null?

[英]How to include column values as null even when condition is not met?

編寫查詢以顯示所有沒有后付費電表的建築物的所有建築物名稱、計量公司名稱和電表類型。

圖像 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' 

嘗試將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 子句中添加別名。 它們不是強制性的,假設沒有兩個表具有相同名稱的列,但僅具有別名會使您的問題更容易回答。

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;

這允許您從任何表中獲取 select 列。

筆記:

  • 幾乎從不需要FULL JOIN
  • 使用有意義的表別名。 任意字母沒有任何意義。 使用表格縮寫。
  • Escaping 帶有方括號的列名和表名只會使代碼更難編寫和閱讀。
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]

用這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM