Оператор SELECT возвращает строки, а SELECT COUNT (*) с тем же WHERE - нет (AWS AuroraDB) - PullRequest
1 голос
/ 13 мая 2019

Это схема базы данных, поскольку она относится к User и GpsPosition:

CREATE TABLE GpsPosition 
(
    altitudeInMeters SMALLINT NOT NULL,
    dateCreated      BIGINT NOT NULL,
    dateRegistered   BIGINT NOT NULL,
    deviceId         BINARY(16) NOT NULL,
    emergencyId      BINARY(16) NULL,
    gpsFix           SMALLINT NOT NULL,
    heading          SMALLINT NOT NULL,
    horizontalUncertaintyInMeters SMALLINT NOT NULL,
    id               BINARY(16) NOT NULL,
    latestForDevice  BOOLEAN NOT NULL,
    latestForUser    BOOLEAN NOT NULL,
    latitude         DOUBLE PRECISION NOT NULL,
    longitude        DOUBLE PRECISION NOT NULL,
    numSatellites    SMALLINT NOT NULL,
    speedInKmph      SMALLINT NOT NULL,
    stale            BOOLEAN NOT NULL,
    userId           BINARY(16) NULL,
    verticalUncertaintyInMeters SMALLINT NOT NULL,

    PRIMARY KEY (id)
);

ALTER TABLE GpsPosition 
    ADD CONSTRAINT GpsPosition_deviceId_fkey 
        FOREIGN KEY (deviceId) REFERENCES Device(id) 
            ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE GpsPosition 
    ADD CONSTRAINT GpsPosition_emergencyId_fkey 
        FOREIGN KEY (emergencyId) REFERENCES Emergency(id) 
            ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE GpsPosition 
    ADD CONSTRAINT GpsPosition_userId_fkey 
        FOREIGN KEY (userId) REFERENCES User(id) 
            ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE GpsPosition 
    ADD CONSTRAINT deviceId_dateCreated_must_be_unique 
        UNIQUE (deviceId, dateCreated);

CREATE INDEX i2915035553 ON GpsPosition (deviceId);
CREATE INDEX deviceId_latestForDevice_is_non_unique ON GpsPosition (deviceId, latestForDevice);
CREATE INDEX i3210815937 ON GpsPosition (emergencyId);
CREATE INDEX i1689669068 ON GpsPosition (userId);
CREATE INDEX userId_latestForUser_is_non_unique ON GpsPosition (userId, latestForUser);

Этот оператор возвращает очень много строк:

select *
from GpsPosition
where exists (select *
              from User
              where User.id = GpsPosition.userId and
                    User.id = UNHEX( '3f4163aab2ac46d6ad15164222aca89e' )
             );

Этот оператор возвращает одну строку (результат) со значением 0:

select count(*)
from GpsPosition
where exists (select *
              from User
              where User.id = GpsPosition.userId and
                    User.id = UNHEX( '3f4163aab2ac46d6ad15164222aca89e' )
             );

Что я не понимаю, так это то, как инструкция SELECT * может возвращать много результатов, тогда как инструкция SELECT COUNT (*) возвращает 0. Они оба имеют одинаково одинаковыеГДЕ утверждение.

1 Ответ

0 голосов
/ 13 мая 2019

Коррелированные подзапросы используются для построчной обработки. Каждый подзапрос выполняется один раз для каждой строки внешнего запроса. Эта диаграмма очень помогает enter image description here Поскольку у внешнего результата запроса есть только одна строка для числа строк в GpsPosition, результат равен 0.

Я думаю, что это должно работать:

select count(*) from (
    select *
    from GpsPosition
    where exists (select *
                  from User
                  where User.id = GpsPosition.userId and
                        User.id = UNHEX( '3f4163aab2ac46d6ad15164222aca89e' )
                 )
) view1
...