Получить комбинации из разных строк в качестве входных данных SQL - PullRequest
0 голосов
/ 25 июня 2018

Я новичок в SQL, и я как-то застрял в проблеме.У меня есть таблица со следующей структурой ... Я не могу изменить формат таблицы.Я попробовал INNER соединения и перекрестное соединение, но это мне не сильно помогло.

Мне нужно получить все записи, которые зависят от моего ввода, например, если я буду вводить данные в Чикаго, Седане и Чилли.

Я должен получить только комбинацию Чикаго или Седан, Чилли, Чикаго и Седан, Чикаго и чили и т. Д., Например, в следующей таблице ID 4 не следует извлекать, так как это комбинация Нью-Йорка и Чили.

Любая помощь будет принята с благодарностью.

ID  TYPE    CODE
1   CITY    Chicago
1   CAR     SEDAN
1   WEATHER CHILLY
2   WEATHER CHILLY
2   CAR     SEDAN
3   CITY    Chicago
4   CITY    New York
4   CAR SEDAN

Table Format

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Небольшое расширение запроса Гордона

http://sqlfiddle.com/#!4/b844db/13

SELECT * FROM TABLE1 t1
WHERE t1.ID IN 
(SELECT ID
FROM TABLE1 t2
GROUP BY ID
HAVING 
    SUM(CASE WHEN CODE IN ('Chicago','SEDAN','CHILLY')
           THEN 1 ELSE 0 END) 
    = COUNT(*)
)
0 голосов
/ 28 июня 2018

Sai,

Вы можете попробовать, чтобы увидеть, действительно ли это то, что вам нужно.

Я добавил еще одну строку в исходную таблицу примеров, чтобы проиллюстрировать, как этоSQL будет отображать.

ID  TYPE    CODE
1   CITY    Chicago
1   CITY    Dallas
1   CAR     SEDAN
1   WEATHER CHILLY
2   WEATHER CHILLY
2   CAR     SEDAN
3   CITY    Chicago
4   CITY    New York
4   CAR SEDAN

Использование этого SQL сделает ваш вывод таблицы более управляемым форматом.

    SELECT * FROM 
((select id, type, code from   TABLE1 t1)
 pivot (listagg(code,',') within group (order by type) 
        for type in('CITY' as CITY,'CAR' as CAR, 'WEATHER' as WEATHER)))
 order by id

Это превратит формат таблицы выше в следующую отформатированную записьнабор.

ID CITY             CAR     WEATHER
1  Chicago,Dallas   SEDAN   CHILLY
2  (null)           SEDAN   CHILLY
3  Chicago          (null)  (null)
4  New York         SEDAN   (null)

Конечно, если вы хотите поместить кавычки вокруг каждого элемента в выходных данных, вы можете сделать это.

    SELECT * FROM 
((select id, type, code from   TABLE1 t1)
 pivot (listagg(''''||code||'''',',') within group (order by type) 
        for type in('CITY' as CITY,'CAR' as CAR, 'WEATHER' as WEATHER)))
 order by id

Это будет отображаться как

ID    CITY                CAR      WEATHER
1     'Chicago','Dallas'  'SEDAN'  'CHILLY'
2     (null)              'SEDAN'  'CHILLY'
3     'Chicago'           (null)   (null)
4     'New York'          'SEDAN'  (null)

Это больше того, что вы ищете?

0 голосов
/ 25 июня 2018

Вы можете использовать group by и having:

select id
from t
group by id
having sum(case when code in ('Chicago', 'Sedan', 'chilly') then 1 else 0 end) = count(*);

Возможно, вы намереваетесь:

having sum(case when type = 'City' and code <> 'Chicago' then 1 else 0 end) = 0 and
       sum(case when type = 'Car' and code <> 'Sedan' then 1 else 0 end) = 0 and
       sum(case when type = 'Weather' and code <> 'Chilly' then 1 else 0 end) = 0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...