В MySQL проблемы с использованием GROUP BY и HAVING для выбора информации из двух таблиц.

Найдите названия всех навыков, которыми обладает хотя бы один кандидат или необходимы хотя бы для одной должности. Не перечисляйте одинаковые имена много раз.

CREATE TABLE SPOSSESSED(
anumber     DECIMAL(6)  NOT NULL, /*applicant*/   
sname       VARCHAR(30) NOT NULL,    /*skill name*/      
slevel      DECIMAL(2)  NOT NULL);

CREATE TABLE SNEEDED(
pnumber DECIMAL(8)  NOT NULL,    /*position*/    
sname   VARCHAR(30) NOT NULL, /*skill name*/
slevel  DECIMAL(2)  NOT NULL);

Если это индивидуально для каждого стола, я вышел с

SELECT sname FROM SPOSSESSED GROUP BY sname HAVING COUNT(anumber) >= 1;
SELECT sname FROM SNEEDED GROUP BY sname HAVING COUNT (pnumber) >= 1;

Проблема, с которой я сталкиваюсь, заключается в объединении этих двух файлов WITHOUT JOIN/UNION. Есть метод, который я пробовал:

SELECT SPOSSESSED.sname FROM SPOSSESSED, SNEEDED
WHERE SPOSSESSED.sname = SNEEDED.sname
GROUP BY SPOSSESSED.sname
HAVING COUNT (pnumber) >= 1 
OR COUNT (anumber) >= 1;

Однако результат не равен результатам отдельных операторов SELECT.


person Caramelia Bachmann    schedule 06.05.2018    source источник
comment
Ваш вопрос не имеет смысла. Во-первых, , — это просто старомодный способ объединения, и вам никогда не следует его использовать. Во-вторых, вам понадобится соединение, объединение или аналогичная конструкция для объединения данных из нескольких таблиц. Так работает SQL.   -  person Gordon Linoff    schedule 06.05.2018
comment
Ваша попытка фактически делает соединение; он выполняет неявное соединение до ANSI-92, которое обычно считается плохим синтаксисом. На самом деле, единственный способ сделать то, что вы хотите здесь, это сделать соединение или, может быть, объединение.   -  person Tim Biegeleisen    schedule 06.05.2018
comment
Правильно, я думаю, единственный способ объединить эти два оператора SELECT. Спасибо!   -  person Caramelia Bachmann    schedule 06.05.2018


Ответы (1)


Ваш вопрос не имеет смысла. Хуже того, это, кажется, подталкивает к использованию запятых для выражения соединений - что-то настолько старомодное, что это заставляет меня думать о женщинах, которых поощряют курить или добавлять свинец в бензин.

Вот один из способов сделать то, что вы хотите в MySQL:

create temporary table t as 
    SELECT sname FROM SPOSSESSED GROUP BY sname HAVING COUNT(anumber) >= 1;

insert into t (sname)
    SELECT sname FROM SNEEDED GROUP BY sname HAVING COUNT(pnumber) >= 1;

select distinct sname
from t;

Я должен отметить, что условие having не имеет значения. Цифры, на которые вы ссылаетесь, никогда не бывают NULL. Я оставил его, потому что он является частью ваших исходных запросов.

Возможно, самый разумный способ ответить на этот вопрос не использует ни явное join, ни union. Однако он предполагает таблицу «навыков»:

select s.*
from skills s
where exists (select 1 from spossessed p where p.sname = s.sname) or
      exists (select 1 from sneeded n where n.sname = s.sname);
person Gordon Linoff    schedule 06.05.2018