检索 Column1 != 来自 Column2 的多个值的行

Retrieve rows where Column1 != Multiple Values from Column2

我有 2 个位置列。我需要找到一种只显示异常的方法,其中 Location1 != Location2,BUT Location2 列中有多个值可以与 Lcoation1 中的值相关联。

例如:Location1 列中的 San Diego 在 Location2 列中可以有 4 个可能的值(North、Central、South、San Diego),这些行需要从 运行 中排除。如果 Location1 列中的圣地亚哥和 Location2 列中的西雅图(例如),则视为异常。

create table Locations
(Id INT, Location1 VARCHAR(30), Location2 VARCHAR(30));

INSERT INTO Locations
VALUES
(1, 'San Diego', 'North'),
(2, 'San Diego', 'South'),
(3, 'San Diego', 'Central'),
(4, 'San Diego', 'Arizona'),
(5, 'San Diego', 'San Diego'),
(6, 'San Diego', 'Seattle'),
(7, 'San Diego', 'North'),
(8, 'San Diego', 'San Diego'),
(9, 'San Diego', 'Central'),
(10, 'San Diego', 'South')

SELECT * FROM Locations

我只能排除位置 1 = 位置 2 的明显情况:

SELECT *
FROM Locations
WHERE Location1 != Location2

预期输出:

Id Lcoation1 Location2
4 San Diego Arizona
6 San Diego Seattle

WITH TIES 与 window 功能一致 sum() over() 可能是这里的一个选项

例子

SELECT Top 1 with ties *
 FROM Locations
 Order By SUM(1) OVER (PARTITION BY LOCATION2) 

结果

Id  Location1   Location2
4   San Diego   Arizona
6   San Diego   Seattle

注意: PARTITION BY 可能包括 LOCATION1 ...很难用您的示例数据来判断:

... SUM(1) OVER (PARTITION BY LOCATION1,LOCATION2) 

如果您愿意进行一些手动(持续)维护,您可以创建有效 Location1-Location2 关系的映射 table 并根据 Locations 过滤在映射 table 上。这样 定义什么是有效的,你可以很容易地找到无效的东西。

DROP TABLE IF EXISTS locations;
CREATE TABLE Locations
(Id INT, Location1 VARCHAR(30), Location2 VARCHAR(30));

DROP TABLE IF EXISTS RegionMap;
CREATE TABLE RegionMap (Location1 VARCHAR(30), Location2 VARCHAR(30));

INSERT dbo.RegionMap (Location1, Location2)
VALUES ('San Diego', 'North'),
('San Diego', 'South'),
('San Diego', 'Central'),
('San Diego', 'San Diego');

INSERT INTO Locations
VALUES
(1, 'San Diego', 'North'),
(2, 'San Diego', 'South'),
(3, 'San Diego', 'Central'),
(4, 'San Diego', 'Arizona'),
(5, 'San Diego', 'San Diego'),
(6, 'San Diego', 'Seattle'),
(7, 'San Diego', 'North'),
(8, 'San Diego', 'San Diego'),
(9, 'San Diego', 'Central');

SELECT l.Location1, l.Location2
FROM locations l
LEFT JOIN dbo.RegionMap m ON m.Location1 = l.Location1
                         AND m.Location2 = l.Location2
WHERE m.Location2 IS NULL;

请注意,我删除了 ID 10(圣地亚哥南部的第二个实例),您仍然会得到正确的结果。

这里的缺点是您必须放置一个进程来维护映射 table。如果您 运行 例行查询此查询并获得输出的定期报告,它将帮助您了解可能需要添加到映射 table.

中的内容

但实际上,最好的办法是首先限制用户可以作为主数据输入的内容...