2017-01-03 2 views
0

Из этой базы данных stucture ...Distinct, где оператор получать затерт

CREATE TABLE points (
    rowid INTEGER PRIMARY KEY, 
    powId INTEGER, 
    userId INTEGER, 
    timeStart DATETIME, 
    timeEnd DATETIME, 
    points NUMERIC, 
    COUNTYNUM NUMERIC, 
-- FOREIGN KEY(powId) REFERENCES points_power(powId) 
-- FOREIGN KEY(userId) REFERENCES users(userId) 
    UNIQUE(userId, timeStart, COUNTYNUM) ON CONFLICT IGNORE 
); 

С помощью этих данных ...

INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('1','7','2','2016-12-31T19:29:23-0500','2016-12-31T20:29:23-0500','2','201612311929'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('2','7','4','2016-12-31T19:29:23-0500','2016-12-31T20:29:23-0500','2','201612311929'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('3','7','12','2016-12-31T19:29:23-0500','2016-12-31T20:29:23-0500','2','201612311929'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('4','7','16','2016-12-31T19:29:23-0500','2016-12-31T20:29:23-0500','2','201612311929'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('5','7','585','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('6','7','2','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('7','7','12','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('9','7','11','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('10','7','593','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('11','7','14','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('12','7','13','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('13','7','11','2017-01-02T13:50:48-0500','2017-01-02T14:50:48-0500','2','201701021350'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('14','7','16','2017-01-02T15:46:07-0500','2017-01-02T16:46:07-0500','2','201701021546'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('15','7','16','2017-01-01T00:33:46-0500','2017-01-01T01:33:46-0500','2','201701010033'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('16','7','2','2017-01-02T13:50:48-0500','2017-01-02T14:50:48-0500','2','201701021350'); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('17','13','1','2017-01-02T17:00:00-0500','2017-01-02T21:00:00-0500','1',NULL); 
INSERT INTO "points" ("rowid","powId","userId","timeStart","timeEnd","points","COUNTYNUM") VALUES ('18','13','2','2017-01-02T17:00:00-0500','2017-01-02T21:00:00-0500','1',NULL); 

И используя этот запрос

SELECT DISTINCT powId, timeStart, timeEnd FROM points WHERE userId != 1;

I» я не получаю результата, которого хочу.

Последние две записи в базе данных, на которые я смотрю прямо сейчас. userId установлен для первой из этих двух записей, но вторая запись маскирует userId, и она все еще возвращает эту отчетливую строку. Есть ли что-нибудь, что я могу сделать для этого запроса, чтобы он не возвращал ЛЮБЫЕ отдельные строки, где userId находится в наборе DISTINCT?

Я принципиально хочу получить все точки, которые userId не назначен. Как мне это сделать? Я решил, что это будет так просто, но это не так.

Пожалуйста, ответьте только SQLite.

ответ

1

Вы должны проверить все (другие) строки с одинаковыми значениями столбцов:

SELECT DISTINCT powId, 
       timeStart, 
       timeEnd 
FROM points 
WHERE NOT EXISTS (SELECT 1 
        FROM points AS p2 
        WHERE p2.powId  = points.powId 
        AND p2.timeStart = points.timeStart 
        AND p2.timeEnd = points.timeEnd 
        AND p2.userId = 1); 
Смежные вопросы