使用 WHERE Exists(SELECT 1 FROM TABLE) 返回不同的行

Returning distinct rows using WHERE Exists(SELECT 1 FROM TABLE)

我的 SQLite 数据库中有两个 table,它们之间是一对多的关系:

CREATE TABLE Reads (
    RowID     INTEGER NOT NULL PRIMARY KEY,
    EventDate INTEGER NOT NULL,
    Plate     TEXT,
    State     TEXT
);

CREATE TABLE ExplodedPlates (
    Plate     TEXT,
    RowID     INTEGER NOT NULL,
    PRIMARY KEY (RowID, Plate)
) WITHOUT RowId;

读取 table 的车牌列包含车牌。数据可能包含我们所说的"ambiguous license plates"。例如,车牌可能包含 "A[0OQ]C1234",其中实际的第二个字符可能是“0”、"O" 或 "Q"。在这种情况下,ExplodedPlates table 中有三行具有相同的 RowID,但 Plate 是 "A0C123",另一行是 "AOC1234",第三行是 "AQC123"。

我需要为每个唯一的 RowID 加入这些 table 和 return 一行,其中车牌与示例中的模式相匹配。因此,如果用户在搜索框中输入 "A[O0]1234",他们应该得到带有车牌 "A[0OQ]1234" 的一行,而不是 3,以及具有与该字符串匹配的其他 RowID 的任何行。

我使用 Entity Framework 编写了一个类似于此的查询:

SELECT DISTINCT r.*
FROM ExplodedPlates A x
JOIN Reads AS r ON r.RowId = x.RowID
WHERE x.Plate GLOB @Plate

这可行,但查询 returned 使用临时 B 树来执行 DISTINCT。我的老板希望我摆脱 DISTINCT 并使用 WHERE EXISTS(SELECT 1 FROM ExplodedPlates WHERE Plate GLOB @Plate),但我不知道如何让它工作。我的数据库中有一个特定案例,其中有 135 行与特定模式匹配,但我使用的查询是 returns 6557 行。显然,这是错误的。

我究竟如何使用 WHERE 子句来生成匹配读取的唯一列表?

这可能是您想要的:

select r.*
from reads r
where exists (select 1
              from ExplodedPlates x
              where r.RowId = x.RowID and
                    x.Plate GLOB @Plate
             );