SQL И посмотреть, установлены ли два флага в двух разных таблицах? - PullRequest
0 голосов
/ 28 февраля 2019
SELECT 1 FROM
(SELECT 1 FROM mytable1 WHERE parentid = 'ID1' AND flag = 'Y') as X,
(SELECT 1 FROM mytable2 WHERE id = 'ID2' AND flag = 'Y') as Y 

Я делаю запрос, чтобы увидеть, установлены ли два флага в двух таблицах, где «parentid» и «id» являются первичными ключами.Запрос должен возвращать строку только в том случае, если оба флага установлены в «Y», или ничего не возвращать иначе, тогда я делаю что-то с этим результатом в своем бэкэнд-коде.

Я проверил это, и это работает, но ячувствую, что это выглядит странно и может быть оптимизировано.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Лучше использовать JOIN вместо выполнения подзапросов

SELECT mytable1.parentid, mytable2.id 
FROM mytable1
JOIN mytable2 ON mytable2.flag = "Y" AND mytable1.flag = "Y"
0 голосов
/ 02 марта 2019

Чтобы получить то, что вы хотите:

SELECT 1
    FROM mytable1 AS a, mytable2 AS b
    WHERE a.parentid = 'ID1' AND a.flag = 'Y'
        AND b.id = 'ID2' AND b.flag = 'Y' 

Но на самом деле, я бы предпочел запрос с LEFT JOIN, который всегда дает одну строку, например:

SELECT CASE WHEN a.flag = 'Y' AND b.flag = 'Y' THEN 1 ELSE 0 END AS result
    FROM TABLE ( VALUES 1 ) AS always(present)
        LEFT JOIN mytable1 AS a ON a.parentid = 'ID1'
        LEFT JOIN mytable2 AS b ON b.id = 'ID2'
0 голосов
/ 28 февраля 2019

Ваш запрос в порядке (хотя я бы использовал CROSS JOIN. Однако я бы предпочел строку с определенным значением. Я бы сказал, что:

SELECT (CASE WHEN EXISTS (SELECT 1 FROM mytable1 WHERE parentid = 'ID1' AND flag = 'Y') AND
                  EXISTS (SELECT 1 FROM mytable2 WHERE id = 'ID2' AND flag = 'Y')
             THEN 1 ELSE 0
        END) as flag

Вам может понадобиться from dual,в зависимости от вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...