Выбор SQL и отделение дубликатов от отдельных записей из ResultSet JDBC - PullRequest
0 голосов
/ 15 марта 2012

В настоящее время у меня есть следующий запрос

SELECT table1.col1, table2.col2  
FROM   table1     
    INNER JOIN table2 ON table1.col1=table2.col6  
WHERE  col3 IN 
           (SELECT col1 
            FROM table3 
            WHERE col4 IN (
                   SELECT col4 
                   FROM table4 
                   WHERE col5 LIKE '%XYZ%'
               )       
            )  ORDER BY table1.col1 

Результат, который я получаю, выглядит следующим образом

COL1  |  COL2
Bob      LA
BOB      NY
Charlie  SF
Donald   Phoenix
Edward   Chicago
Edward   DC
Florence Miami
George   Sunnyvale
Helen    Orlando
Helen    Houston

Если вы наблюдаете результаты, следующие записи дублируются на Col1 (Боб,Эдуард, Елена)Ниже приведены только отдельные записи (Чарли, Дональд, Флоренция, Джордж).

Мне нужны 2 разных запроса, в которых один запрос должен возвращать только отдельные записи, а другой - только дубликаты.«Мне нужны ОБА Col1 и Col2, возвращенные из обоих запросов».Я пытался изменить, но либо выдает ошибку, либо не приводит ни к каким результатам.

Желаемый результат

Результат Query1 (только отдельные записи)

COL1  |  COL2
Charlie  SF
Donald   Phoenix
Florence Miami
George   Sunnyvale

Результат Query2 (возвращены только повторяющиеся записи)

COL1  |  COL2
Bob      LA
BOB      NY
Edward   Chicago
Edward   DC
Helen    Orlando
Helen    Houston

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

А если это не Oracle, познакомьтесь с конструкцией GROUP BY xxx HAVING yyy = z.

Простое добавление его в ваш запрос не будет работать, потому что вы хотите выбрать также столбец, по которому вы не группируете, но вот один простой способ съесть ваш торт и получить его:

SELECT table1.col1, table2.col2  
FROM   table1     
INNER JOIN table2 ON table1.col1=table2.col6  
WHERE  col3 IN 
       (SELECT col1 
        FROM table3 
        WHERE col4 IN (
               SELECT col4 
               FROM table4 
               WHERE col5 LIKE '%XYZ%'
           )       
        )
AND col1 IN (
    SELECT table1.col1
    FROM   table1     
        INNER JOIN table2 ON table1.col1=table2.col6  
    WHERE  col3 IN 
       (SELECT col1 
        FROM table3 
        WHERE col4 IN (
               SELECT col4 
               FROM table4 
               WHERE col5 LIKE '%XYZ%'
           )       
        )
    GROUP BY table1.col1
    HAVING COUNT(table1.col1) > 1
)
ORDER BY table1.col1 
0 голосов
/ 15 марта 2012

С оракулом аналитические функции - ваш друг. Если вы не против иметь дополнительный столбец в ваших данных, вы можете сделать что-то вроде этого:

Для единичных результатов:

SELECT 
      table1.col1,
      table2.col2,  
      count(*) over(partition by table1.col1) AS col1count
FROM   table1     
    INNER JOIN table2 ON table1.col1=table2.col6  
WHERE  col3 IN 
       (SELECT col1 
        FROM table3 
        WHERE col4 IN (
               SELECT col4 
               FROM table4 
               WHERE col5 LIKE '%XYZ%'
           )       
        )  ORDER BY table1.col1 
     AND col1count = 1

и для дубликатов просто измените последнюю строку на

     AND col1count > 1
...