Sql 我们可以在多个列上使用NOT IN吗?
我正在使用Sql Server创建一个涉及单个表的存储过程 我想将WHERE子句中的条件应用于一对列。i、 e.我想要这样的东西: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(
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'}的匹配。