值列表中 table 中缺少的 Select 个元素
Select elements that are absent in a table from a list of value
我有一个带有 id 和标签的 table T
ID LABEL
1 label_1
2 label_2
3 label_3
我有一个标签列表:
('label_1', 'label_4', 'label_6' )
我想要 select table T 中不存在的那些。在我的情况下,我会得到 'label_4' 和 'label_6'。
我怎样才能在 SQL 中做到这一点?
编辑 1
这些标签是外部值。我想在日志文件中打印 table 中不存在的值,可能使用假脱机
编辑 2
我目前正在尝试使用 pl/SQL 将我所有的值放入 table 中,因为它基本上是一个巨大的值列表。我有这个:
DECLARE
type array_t is varray(603) of varchar2(50 BYTE);
labels array_t := array_t(
'210',
'label_1',
'label_6',
'label_4'
);
BEGIN
For i in labels LOOP
Insert Into TEMP_LABEL (LABEL)
Values (i);
END LOOP;
commit;
END;
但我收到以下错误:pls-00456 item is not a cursor
我被困在这里了。
查看我的 sqlfiddle (and postgres version) 使用 table
的解决方案
相关查询如下:
SELECT T_TEMP.LABEL, T.LABEL
FROM T_TEMP
LEFT JOIN T
ON T_TEMP.LABEL = T.LABEL
WHERE T.LABEL IS NULL;
如果有充分理由不使用 table 来存储这些值,请告诉我们。
根据数据集的大小,在以下查询之间进行选择可能会对性能产生影响(参见 excellent explanation comparing the methods):
-- LEFT JOIN / IS NULL
SELECT T_TEMP.LABEL, T.LABEL
FROM T_TEMP
LEFT JOIN T ON T_TEMP.LABEL = T.LABEL
WHERE T.LABEL IS NULL;
-- NOT EXISTS
SELECT T_TEMP.LABEL
FROM T_TEMP
WHERE NOT EXISTS
(
SELECT T.LABEL
FROM T
WHERE T_TEMP.LABEL = T.LABEL
);
-- NOT IN
SELECT T_TEMP.LABEL
FROM T_TEMP
WHERE LABEL NOT IN
(
SELECT T.LABEL
FROM T
);
随着数据集的增长,LEFT JOIN / IS NULL 或 NOT EXISTS 应该表现得更好,但根据 this fiddle 中的执行计划,NOT IN 似乎以最低的成本执行。
在 "EDIT 2" 中提供更多信息之前,这是我的回答。我认为需要更多特定于上下文的信息。不管怎样,这段代码 returns 行标签不是原来的 table:
CREATE TABLE OriginalTable (Id INT, Label VARCHAR(20));
INSERT INTO OriginalTable (Id, Label)
VALUES (1, 'label_1'), (2, 'label_2'), (3, 'label_3');
-- Create a table with the labels you want to compare
CREATE TABLE ComparisonTable (Id INT, Label VARCHAR(20));
INSERT INTO ComparisonTable (Id, Label)
VALUES (1, 'label_1'), (2, 'label_4'), (3, 'label_6');
SELECT Label
FROM ComparisonTable
WHERE Label NOT IN (SELECT Label FROM OriginalTable);
我有一个带有 id 和标签的 table T
ID LABEL
1 label_1
2 label_2
3 label_3
我有一个标签列表:
('label_1', 'label_4', 'label_6' )
我想要 select table T 中不存在的那些。在我的情况下,我会得到 'label_4' 和 'label_6'。 我怎样才能在 SQL 中做到这一点?
编辑 1
这些标签是外部值。我想在日志文件中打印 table 中不存在的值,可能使用假脱机
编辑 2
我目前正在尝试使用 pl/SQL 将我所有的值放入 table 中,因为它基本上是一个巨大的值列表。我有这个:
DECLARE
type array_t is varray(603) of varchar2(50 BYTE);
labels array_t := array_t(
'210',
'label_1',
'label_6',
'label_4'
);
BEGIN
For i in labels LOOP
Insert Into TEMP_LABEL (LABEL)
Values (i);
END LOOP;
commit;
END;
但我收到以下错误:pls-00456 item is not a cursor
我被困在这里了。
查看我的 sqlfiddle (and postgres version) 使用 table
的解决方案相关查询如下:
SELECT T_TEMP.LABEL, T.LABEL
FROM T_TEMP
LEFT JOIN T
ON T_TEMP.LABEL = T.LABEL
WHERE T.LABEL IS NULL;
如果有充分理由不使用 table 来存储这些值,请告诉我们。
根据数据集的大小,在以下查询之间进行选择可能会对性能产生影响(参见 excellent explanation comparing the methods):
-- LEFT JOIN / IS NULL
SELECT T_TEMP.LABEL, T.LABEL
FROM T_TEMP
LEFT JOIN T ON T_TEMP.LABEL = T.LABEL
WHERE T.LABEL IS NULL;
-- NOT EXISTS
SELECT T_TEMP.LABEL
FROM T_TEMP
WHERE NOT EXISTS
(
SELECT T.LABEL
FROM T
WHERE T_TEMP.LABEL = T.LABEL
);
-- NOT IN
SELECT T_TEMP.LABEL
FROM T_TEMP
WHERE LABEL NOT IN
(
SELECT T.LABEL
FROM T
);
随着数据集的增长,LEFT JOIN / IS NULL 或 NOT EXISTS 应该表现得更好,但根据 this fiddle 中的执行计划,NOT IN 似乎以最低的成本执行。
在 "EDIT 2" 中提供更多信息之前,这是我的回答。我认为需要更多特定于上下文的信息。不管怎样,这段代码 returns 行标签不是原来的 table:
CREATE TABLE OriginalTable (Id INT, Label VARCHAR(20));
INSERT INTO OriginalTable (Id, Label)
VALUES (1, 'label_1'), (2, 'label_2'), (3, 'label_3');
-- Create a table with the labels you want to compare
CREATE TABLE ComparisonTable (Id INT, Label VARCHAR(20));
INSERT INTO ComparisonTable (Id, Label)
VALUES (1, 'label_1'), (2, 'label_4'), (3, 'label_6');
SELECT Label
FROM ComparisonTable
WHERE Label NOT IN (SELECT Label FROM OriginalTable);