2015-04-24 3 views
0

У меня есть две таблицы в моей SQLite базы данных с одного до многих отношениях между ними:Возвращающиеся различных строк с использованием предложения WHERE EXISTS (SELECT 1 FROM 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; 

чтениями столбец Тарелка таблицы содержит номерные знаки. Данные могут содержать то, что мы называем «неоднозначными номерными знаками». Например, пластина может содержать «A [0OQ] C1234», где фактический второй символ может быть «0», «O» или «Q». В этом случае в таблице ExplodedPlates имеется три строки с тем же RowID, но Plate - «A0C123», другой - с «AOC1234», а третий - с «AQC123».

Мне нужно присоединиться к этим таблицам и вернуть одну строку для каждого уникального RowID, где тарелка соответствует шаблону, аналогичному примеру в примере. Поэтому, если пользователь вводит «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 

Это работает, но запрос возвращал использует временную B-Tree сделать DISTINCT. Мой босс хочет, чтобы я избавился от DISTINCT и использовал WHERE EXISTS(SELECT 1 FROM ExplodedPlates WHERE Plate GLOB @Plate), но я не знаю, как заставить это работать. У меня есть конкретный случай в моей базе данных с 135 строками, которые соответствуют определенному шаблону, но запрос, который я использую, возвращает 6557 строк. Ясно, что это неправильно.

Как именно я могу использовать это предложение WHERE, чтобы сгенерировать уникальный список совпадающих чтений?

ответ

1

Это может быть то, что вы хотите:

select r.* 
from reads r 
where exists (select 1 
       from ExplodedPlates x 
       where r.RowId = x.RowID and 
        x.Plate GLOB @Plate 
      ); 
Смежные вопросы