问题描述
嗨,我对 sql server 有一个疑问。 如果不存在,如何找到expeted颜色存在与否 然后获取productid信息
表:产品信息
CREATE TABLE [dbo].[productInfo](
[Productid] [int] NULL,[Productcolor] [varchar](50) NULL
)
INSERT [dbo].[productInfo] ([Productid],[Productcolor]) VALUES (1,N'red')
INSERT [dbo].[productInfo] ([Productid],N'blue')
INSERT [dbo].[productInfo] ([Productid],N'white')
INSERT [dbo].[productInfo] ([Productid],[Productcolor]) VALUES (2,[Productcolor]) VALUES (3,[Productcolor]) VALUES (4,N'white')
基于以上数据,我想要如下输出
Productid | Productcolor
2 | white missed
3 | blue missed
3 | white missed
每个 productid 应该有红色,蓝色,白色。如果任何颜色不存在,那么 需要显示那个productid和color。如果所有颜色都存在,那么就不需要显示productid
我试过如下
select *
from productinfo
where Productcolor not in ( 'red','blue','white')
能否请您告诉我如何编写查询以在 sql server 中完成此任务。
解决方法
请您尝试以下操作:
SELECT P.PRODUCT_ID,C.Productcolor
FROM
(
SELECT DISTINCT PRODUCTID AS PRODUCT_ID FROM DBO.productInfo
)P
CROSS JOIN
(
SELECT DISTINCT PRODUCTCOLOR
FROM DBO.productInfo
)C
EXCEPT
SELECT X.PRODUCTID,X.PRODUCTCOLOR
FROM DBO.productInfo AS X
,
一种可能的方法是使用 EXCEPT
集合运算符和具有所有可能颜色的 VALUES
表值构造函数:
SELECT DISTINCT p.Productid,v.Productcolor
FROM productInfo p
CROSS APPLY (VALUES ('red'),('blue'),('white')) v (Productcolor)
EXCEPT
SELECT p.Productid,p.Productcolor
FROM productInfo p
结果:
Productid Productcolor
2 white
3 blue
3 white
,
另一种方法是使用半反连接:
SELECT T.Productcolor,T.Productid
FROM productInfo AS CLP
RIGHT OUTER JOIN (SELECT DISTINCT C.Productcolor,P.Productid
FROM productInfo AS C
CROSS JOIN productInfo AS P) AS T
ON CLP.Productid = T.Productid AND CLP.Productcolor = T.Productcolor
WHERE CLP.Productid IS NULL;
可以编写一些其他查询...带有 NOT EXISTS :
SELECT CP.*
FROM (SELECT DISTINCT C.Productcolor,P.Productid
FROM productInfo AS C
CROSS JOIN productInfo AS P) AS CP
WHERE NOT EXISTS(SELECT *
FROM productInfo AS C
WHERE CP.Productid = C.Productid AND CP.Productcolor = C.Productcolor);
或者带有相关的 NOT IN :
SELECT CP.*
FROM (SELECT DISTINCT C.Productcolor,P.Productid
FROM productInfo AS C
CROSS JOIN productInfo AS P) AS CP
WHERE CP.Productcolor NOT IN(SELECT Productcolor
FROM productInfo AS C
WHERE CP.Productid = C.Productid);
,
SELECT *
FROM productInfo p
WHERE NOT EXISTS (SELECT 1 FROm productInfo pBlue WHERE pBlue.Productcolor='blue' and pBlue.Productid=p.Productid)
OR NOT EXISTS (SELECT 1 FROm productInfo pRed WHERE pRed.Productcolor='red' and pRed.Productid=p.Productid)
OR NOT EXISTS (SELECT 1 FROm productInfo pWhite WHERE pWhite.Productcolor='white' and pWhite.Productid=p.Productid);
将执行计划与此处给出的其他答案进行比较时,可能需要更多的打字工作,但应该更快。