2013-08-13 3 views
0

Я просто хочу знать внутреннее выполнение этого запроса, особенно, как значения в из подзапроса, использованныхСложность понимания этого оракул запроса SQL

SELECT bu, location FROM 
( 
    SELECT DISTINCT bu, hqname, location FROM DOCTOR 
    UNION 
    SELECT DISTINCT bu, hqname, location FROM CHEMIST 
    UNION 
    SELECT DISTINCT bu, hqname, location FROM STOCKIST 
) 
GROUP BY bu, location 
HAVING COUNT (DISTINCT hqname) > 1; 

ответ

3

комментарии SQL

SELECT -- bu and location from doctors, chemists and stockists 
     -- (see inner query) 
     bu, 
     location 
    FROM (-- All doctors, chemists and stockists 
      -- with duplicates removed: 
      -- e.g. if a person is a chemist and a doctor, only one record is preserved 
      SELECT DISTINCT bu, 
          hqname, 
          location 
        FROM DOCTOR 
      UNION 
      SELECT DISTINCT bu, 
          hqname, 
          location 
        FROM CHEMIST 
      UNION 
      SELECT DISTINCT bu, 
          hqname, 
          location 
        FROM STOCKIST) 
GROUP BY -- combining "bu" and "location" (for HAVING) 
     bu, 
     location 
     -- choose these records only that have more than one hqName 
     -- for the same bu and location, e.g. 
     -- hqName bu loc 
     --  x 1 2 
     --  x 1 2 <-- second hqName ("x") for the same bu and loc (1, 2) 
    HAVING COUNT (DISTINCT hqname) > 1; 
+0

'выбрать только эти записи, которые имеют более одного hqName - для того же бушель и местоположение, например, - hqName bu loc ' – kushalvm

0

В ниже запросе результата трех таблиц " ДОКТОР»,„ХИМИК“и„продавцов“в сочетании с одним результатом (лечение в виде таблицы), используя UNION

SELECT DISTINCT bu, hqname, location FROM DOCTOR 
    UNION 
    SELECT DISTINCT bu, hqname, location FROM CHEMIST 
    UNION 
    SELECT DISTINCT bu, hqname, location FROM STOCKIST 

Сводные данные извлекаются с помощью GROUP BY с подсчета hqname> 1 для каждый (бушель, место нахождение) группа, как показано ниже

GROUP BY bu, location 
HAVING COUNT (DISTINCT hqname) > 1; 

и, наконец, вы получите уникальную ному, место из из результирующего набора просто положить в

SELECT bu, location FROM Resultset 
GROUP BY bu, location 
HAVING COUNT (DISTINCT hqname) > 1; 
0

Попробуйте этот запрос без использования DISTINCT возвращающих одни и те же результаты -

SELECT bu, location 
FROM ( 
    SELECT bu, hqname, location FROM DOCTOR 
    UNION 
    SELECT bu, hqname, location FROM CHEMIST 
    UNION 
    SELECT bu, hqname, location FROM STOCKIST 
) AS t 
GROUP BY bu, location 
HAVING COUNT (DISTINCT hqname) > 1 
1

В подзапрос возвращает уникальные cobinations из bu, hqname, location

Затем они сгруппированы и остаются только места, где осталось более одного hqname.

Смежные вопросы