如果在另一个表中找不到其ID,我该如何返回一行?

Lan*_*ine 10 sql t-sql sql-server sql-server-2008

我在MS SQL 2008数据库,清单和清单类型中有2个表,我想创建一个select语句,它将为我提供清单中所有在ListingType表中没有其ListingID的行.

我对如何开始这个陈述感到非常困惑.

示例SQL语句 - 比我解释的要多得多,但是你应该能够得到我所要求的内容.

SELECT     Listing.Title, Listing.MLS, COALESCE (Pictures.PictureTH, '../default_th.jpg') AS PictureTH, COALESCE (Pictures.Picture, '../default.jpg') AS Picture, Listing.ID, 
                      Listing.Description, Listing.Lot_Size, Listing.Building_Size, Listing.Bathrooms, Listing.Bedrooms, Listing.Address1, Listing.Address2, 
                      Listing.City, Locations.Abbrev, Listing.Zip_Code, Listing.Price, Listing.Year_Built, ListingTypeMatrix.ListingTypeID
FROM         Listing INNER JOIN
                      Locations ON Listing.State = Locations.LocationID LEFT OUTER JOIN
                      ListingTypeMatrix ON Listing.ID = ListingTypeMatrix.ListingID LEFT OUTER JOIN
                      Pictures ON Listing.ID = Pictures.ListingID
WHERE     (ListingTypeMatrix.ListingTypeID = '4') AND 
          ((Pictures.ID IS NULL) OR (Pictures.ID =
                          (SELECT     MIN(ID)
                            FROM          Pictures
                            WHERE      (ListingID = Listing.ID))))
Run Code Online (Sandbox Code Playgroud)

ListingTypeMatrix.ListingTypeID ='4'是我不知道要改变它的部分,因为它不会有记录.

OMG*_*ies 28

使用NOT EXISTS

SELECT t.*
  FROM LISTING t
 WHERE NOT EXISTS(SELECT NULL
                    FROM LISTINGTYPE lt
                   WHERE lt.listingid = t.listingid)
Run Code Online (Sandbox Code Playgroud)

使用NOT IN

SELECT t.*
  FROM LISTING t
 WHERE t.listingid NOT IN (SELECT lt.listingid
                             FROM LISTINGTYPE lt)
Run Code Online (Sandbox Code Playgroud)

使用LEFT JOIN/IS NULL

   SELECT t.*
     FROM LISTING t
LEFT JOIN LISTINGTYPE lt ON lt.listingid = t.listingid
    WHERE lt.listingid IS NULL
Run Code Online (Sandbox Code Playgroud)

摘要

Quote:

在SQL Server中,NOT EXISTS和NOT IN谓词是搜索缺失值的最佳方法,只要两个列都是NOT NULL即可.他们通过某种反加入来制定安全有效的计划.

LEFT JOIN/IS NULL效率较低,因为它不会尝试跳过右表中已匹配的值,返回所有结果并将其过滤掉.