sql server 中是否存在颜色

问题描述

嗨,我对 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);

将执行计划与此处给出的其他答案进行比较时,可能需要更多的打字工作,但应该更快。