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
SELECT t.*
FROM LISTING t
WHERE NOT EXISTS(SELECT NULL
FROM LISTINGTYPE lt
WHERE lt.listingid = t.listingid)
Run Code Online (Sandbox Code Playgroud)
SELECT t.*
FROM LISTING t
WHERE t.listingid NOT IN (SELECT lt.listingid
FROM LISTINGTYPE lt)
Run Code Online (Sandbox Code Playgroud)
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)
在SQL Server中,NOT EXISTS和NOT IN谓词是搜索缺失值的最佳方法,只要两个列都是NOT NULL即可.他们通过某种反加入来制定安全有效的计划.
LEFT JOIN/IS NULL效率较低,因为它不会尝试跳过右表中已匹配的值,返回所有结果并将其过滤掉.