Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我们可以在多个列上使用NOT IN吗?_Sql_Sql Server_Stored Procedures_Where Clause - Fatal编程技术网

Sql 我们可以在多个列上使用NOT IN吗?

Sql 我们可以在多个列上使用NOT IN吗?,sql,sql-server,stored-procedures,where-clause,Sql,Sql Server,Stored Procedures,Where Clause,我正在使用Sql Server创建一个涉及单个表的存储过程 我想将WHERE子句中的条件应用于一对列。i、 e.我想要这样的东西: CREATE PROCEDURE afficherCreationLuns (@start DATE, @end DATE) AS SELECT dateMin = MIN(t1.dateCollecte), displayName, label, date = DATEADD(

我正在使用Sql Server创建一个涉及单个表的存储过程

我想将WHERE子句中的条件应用于一对列。i、 e.我想要这样的东西:

CREATE PROCEDURE afficherCreationLuns (@start DATE, @end DATE)
                    AS
                    SELECT dateMin = MIN(t1.dateCollecte), displayName, label,     date = DATEADD(day, -1, MIN(dateCollecte)), capacityInKB = MIN(capacityInKB)
                    FROM Vsp 
                    WHERE dateCollecte > @start AND dateCollecte <= @end
                                    AND (label, displayName) NOT IN (SELECT label, displayName
                                                            FROM Vsp 
                                                            WHERE dateCollecte = @start)

                    GROUP BY displayName, label
SELECT
    dateMin = MIN(t1.dateCollecte)
,   t1.displayName
,   t1.label
,   date = DATEADD(day, -1, MIN(t1.dateCollecte))
,   capacityInKB = MIN(t1.capacityInKB)
FROM Vsp t1
WHERE t1.dateCollecte > @start
  AND t1.dateCollecte <= @end
  AND NOT EXISTS (
    SELECT *
    FROM Vsp t2
    WHERE t2.dateCollecte = @start
      AND t2.label=t1.label
      AND t2.displayName=t1.displayName
  )
GROUP BY t1.displayName, t1.label
经过一些研究,我更改了代码以使用EXISTS子句,这似乎更适合我的需要。以下是我现在拥有的:

CREATE PROCEDURE afficherCreationLuns (@start DATE, @end DATE)
                    AS
                    SELECT dateMin = MIN(t1.dateCollecte), t1.displayName, t1.label, date = DATEADD(day, -1, MIN(t1.dateCollecte)), capacityInKB = MIN(t1.capacityInKB)
                    FROM Vsp t1
                    WHERE EXISTS (SELECT t2.displayName, t2.label
                                    FROM Vsp t2
                                    WHERE t1.displayName = t2.displayName AND t1.label = t2.label AND t2.dateCollecte > @start AND t2.dateCollecte <= @end
                                    AND (t1.label NOT IN (SELECT t3.label
                                                            FROM Vsp t3
                                                            WHERE t3.dateCollecte = @start)
                                    OR t1.displayName NOT IN (SELECT t4.displayName
                                                                    FROM Vsp t4
                                                                    WHERE t4.dateCollecte = @start) ) )
                    GROUP BY t1.displayName, t1.label
但它没有改变任何东西。

您可以将不在替换为不存在,如下所示:

CREATE PROCEDURE afficherCreationLuns (@start DATE, @end DATE)
                    AS
                    SELECT dateMin = MIN(t1.dateCollecte), displayName, label,     date = DATEADD(day, -1, MIN(dateCollecte)), capacityInKB = MIN(capacityInKB)
                    FROM Vsp 
                    WHERE dateCollecte > @start AND dateCollecte <= @end
                                    AND (label, displayName) NOT IN (SELECT label, displayName
                                                            FROM Vsp 
                                                            WHERE dateCollecte = @start)

                    GROUP BY displayName, label
SELECT
    dateMin = MIN(t1.dateCollecte)
,   t1.displayName
,   t1.label
,   date = DATEADD(day, -1, MIN(t1.dateCollecte))
,   capacityInKB = MIN(t1.capacityInKB)
FROM Vsp t1
WHERE t1.dateCollecte > @start
  AND t1.dateCollecte <= @end
  AND NOT EXISTS (
    SELECT *
    FROM Vsp t2
    WHERE t2.dateCollecte = @start
      AND t2.label=t1.label
      AND t2.displayName=t1.displayName
  )
GROUP BY t1.displayName, t1.label

我们的想法是使用附加条件运行内部选择,将label和displayName与外部选择的相应字段相匹配,并将外部选择的记录放在可以找到此类匹配的位置。

您可以将两列连接在一起吗?像这样:

SELECT *
FROM [TABLE]
WHERE COLUMN1+' '+COLUMN2
    NOT IN (
        SELECT COLUMN1+' '+COLUMN2
            FROM [OTHER-TABLE])

谢谢。

这样试试Exists子句。我不确定引用主VSP表的方式,但我认为where子句应该满足您的要求


如果不存在,请从Vsp中选择*,其中dateCollecte=@start和label=Vsp.label和displayName=Vsp.displayName

当连接的结果产生假别名时,这种方法可能会产生意外的结果。例如,您将获得配对{'quick',brown fox'}和{'quick brown',fox'}的匹配。