T-SQL 在不同行的不同列中的一列中查找值
T-SQL Find value in one column in different column on different row
这个很难解释,所以我会尽力的。
我有这个 table(存在其他列但与我的查询无关)。
CREATE TABLE ClientRelationships
(
Client1 VARCHAR(10) NOT NULL,
Client2 VARCHAR(10) NULL
)
INSERT INTO ClientRelationships (Client1, Client2)
VALUES ('C12345', 'C67890'),
('C54353', 'C76345'),
('C76345', 'C54353'),
('C73246', NULL),
('C67890', 'C12345')
客户端 1
客户端2
C12345
C67890
C54353
C76345
C76345
C54353
C73246
空
C67890
C12345
从数据中可以看出,有几行Client1的值在另一行中显示为Client2。在这些情况下,我要做的是将第一次出现标记为“主要”,将第二次出现标记为“次要”(其中 Client1 值位于不同行的 Client2 列中)。也许就像一个名为“Primary”的布尔列设置为 0 或 1。
如果 Client2 列中没有值 (NULL),主列将设置为 1
我的示例数据的结果应该是这样的。
客户端 1
客户端2
小学
C12345
C67890
1
C54353
C76345
1
C76345
C54353
0
C73246
空
1
C67890
C12345
0
希望这是有道理的。
我正在使用 SQL Server 2019,但可以满足 2012 年及更高版本的任何需求,因为我拥有所有实例。
记录并不总是同时出现在table。
我真的不确定如何处理这个问题,所以寻求一些建议。
如果有定义行顺序的列,例如 ID
,那么您可以使用 CASE
表达式和 EXISTS
:
SELECT c1.*,
CASE
WHEN EXISTS(SELECT 1 FROM ClientRelationships c2 WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1) THEN 0
ELSE 1
END [Primary]
FROM ClientRelationships c1
或者,使用相关子查询:
SELECT c1.*,
(
SELECT COALESCE(MAX(0), 1)
FROM ClientRelationships c2
WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1
) [Primary]
FROM ClientRelationships c1
参见demo。
这个很难解释,所以我会尽力的。
我有这个 table(存在其他列但与我的查询无关)。
CREATE TABLE ClientRelationships
(
Client1 VARCHAR(10) NOT NULL,
Client2 VARCHAR(10) NULL
)
INSERT INTO ClientRelationships (Client1, Client2)
VALUES ('C12345', 'C67890'),
('C54353', 'C76345'),
('C76345', 'C54353'),
('C73246', NULL),
('C67890', 'C12345')
客户端 1 | 客户端2 |
---|---|
C12345 | C67890 |
C54353 | C76345 |
C76345 | C54353 |
C73246 | 空 |
C67890 | C12345 |
从数据中可以看出,有几行Client1的值在另一行中显示为Client2。在这些情况下,我要做的是将第一次出现标记为“主要”,将第二次出现标记为“次要”(其中 Client1 值位于不同行的 Client2 列中)。也许就像一个名为“Primary”的布尔列设置为 0 或 1。
如果 Client2 列中没有值 (NULL),主列将设置为 1
我的示例数据的结果应该是这样的。
客户端 1 | 客户端2 | 小学 |
---|---|---|
C12345 | C67890 | 1 |
C54353 | C76345 | 1 |
C76345 | C54353 | 0 |
C73246 | 空 | 1 |
C67890 | C12345 | 0 |
希望这是有道理的。
我正在使用 SQL Server 2019,但可以满足 2012 年及更高版本的任何需求,因为我拥有所有实例。
记录并不总是同时出现在table。
我真的不确定如何处理这个问题,所以寻求一些建议。
如果有定义行顺序的列,例如 ID
,那么您可以使用 CASE
表达式和 EXISTS
:
SELECT c1.*,
CASE
WHEN EXISTS(SELECT 1 FROM ClientRelationships c2 WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1) THEN 0
ELSE 1
END [Primary]
FROM ClientRelationships c1
或者,使用相关子查询:
SELECT c1.*,
(
SELECT COALESCE(MAX(0), 1)
FROM ClientRelationships c2
WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1
) [Primary]
FROM ClientRelationships c1
参见demo。