SQL-запрос правильный? - PullRequest
       4

SQL-запрос правильный?

0 голосов
/ 12 апреля 2019

Я пытался поставить под сомнение критерии продукта в таблице.Значения NAME и VAL находятся в разных строках.Я спрашиваю, равны ли записи ИМЯ = aa, bb, cc ,.и VAL = 10,20,30.Я переворачиваю результаты.Я думаю, что SQL-запрос работает правильно.Мне удалось исправить запрос столбцов с помощью следующего метода.

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

test table:

Id  PID NAME VAL
1   1   aa   10
2   1   bb   20
3   1   cc   30

4   2   aa   10
5   2   bb   20
6   2   cc   30

7   3   aa   10
8   3   bb   20
9   3   cc   999



Query:

SELECT PID from test WHERE
PID IN (SELECT PID FROM test WHERE NAME='aa' and VAL='10')
AND
PID IN (SELECT PID FROM test WHERE NAME='bb' and VAL='20')
AND
PID IN (SELECT PID FROM test WHERE NAME='cc' and VAL='30')
GROUP BY (PID)



Result:

1
2

Я подумываю использовать его с такими (<> =) операторами.Это был конечный результат.Я хочу, чтобы вы прокомментировали, если это правда.

SELECT t.pid from test t 
WHERE
(t.name = 'aa' and t.val = 10)
OR 
(t.name = 'bb' and t.val = 20) 
OR 
(t.name = 'cc' and t.val > 30) 
GROUP BY t.pid 
HAVING count(t.pid) = 3;

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Вы также можете написать

SELECT a.PID
FROM   test a, test b, test c
WHERE  (a.NAME = 'aa' AND a.VAL = '10') AND
       (b.NAME = 'bb' AND b.VAL = '20') AND
       (c.NAME = 'cc' AND c.VAL = '30') AND
       (a.PID = b.PID AND b.PID = c.PID);

Я не слишком уверен в производительности, так как оптимизатор запросов может свести оба этих запроса к одному и тому же запросу, но он не должен работать хуже, чем ваш текущий.

1 голос
/ 12 апреля 2019

Я рекомендую агрегацию для этой цели. Если у вас нет дубликатов name / val, то:

select t.pid
from test t
where (t.name, t.val) in ( ('aa', '10'), ('bb', '20'), ('cc', '30') )
group by t.pid
having count(*) = 3;

Если вы можете иметь дубликаты, используйте:

having count(distinct t.name, t.val)
0 голосов
/ 12 апреля 2019

То, что делает ваш запрос, в основном похоже на это:

SELECT PID 
FROM test 
WHERE NAME IN ('aa','bb','cc') 
AND VAL IN ('10','20','30')
GROUP BY PID;

Если у вас нет других условий, которые вы хотели бы добавить.

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