Объединение всех запросов в один - PullRequest
0 голосов
/ 24 марта 2020

У меня есть таблица из 2 столбцов, которую мне нужно запросить к другой таблице из 2 столбцов. У меня есть несколько запросов, чтобы определить:

  1. , если столбец 1 существует
  2. , если столбец 2 существует
  3. , если существует комбинация столбца 1 и 2 (если нет, получить соответствующие значения каждого из них)

Образцы таблиц:

create table tblSource (col1 varchar(20), col2 varchar(20))
create table myTable (colA varchar(20), colB varchar(20))

insert into tblSource (col1, col2) 
values ('foo1','bar1'), ('foo2','bar2'), ('foo3','bar3'),('foo4','bar4');

insert into myTable (colA, colB) 
values ('foo1','bar3'), ('foo2','bar2'), ('foo5','bar3'),('foo6','bar6');

Я хочу показать, что в myTable ('foo1', 'bar3') существует отдельно, но их комбинация не имеет, и foo1 ассоциируется с bar1, а bar3 ассоциируется с foo1 в tblSource. Какой самый краткий запрос для достижения этой цели?

Я написал простые отдельные запросы, подобные следующим, но я думаю, что должен быть лучший способ добиться этого.

Возвращает, какие значения colA существуют или не существуют в tblSource. Я должен сделать то же самое для colB, а затем для комбинации.

Последнее замечание, что я использую базу данных Azure SQL, однако мне нужно использовать ADO для запуска запросов из Excel.

SELECT col1, colA 
FROM myTable 
LEFT JOIN tblSource ON myTable.colA = tblSource.col1

Редактировать:

Ожидаемый результат должен выглядеть примерно так:

1. ('foo1','bar3'): both exist, but not associated, foo1-bar1 , foo3-bar3
2. ('foo2','bar2'): both exist and associated
3. ('foo5','bar3'): colB exist only, NULL, foo3-bar3
4. ('foo6','bar6'): None exist

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Я бы предпочел просто использовать отдельные столбцы для хранения информации, но вы можете представить это как строки - с большим case выражением.

Вот метод:

select col1, col2, max(in_s) as in_s, max(in_m) as in_m,
       (case when max(in_s) = 1 and max(in_m) = 1
             then 'in both and associated'
             when max(in_s) = 1 and
                  max(max(in_m)) over (partition by col1) = 1 and
                  max(max(in_m)) over (partition by col2) = 1 
             then 'in both, both not associated'
             when max(in_m) = 1 and
                  max(max(in_s)) over (partition by col1) = 1 and
                  max(max(in_s)) over (partition by col2) = 1 
             then 'in both, both not associated'
             when max(in_s) = 1 and
                  max(max(in_m)) over (partition by col1) = 1
             then 'pair in srcTable, col1 in mytable'
             when max(in_s) = 1 and
                  max(max(in_m)) over (partition by col2) = 1
             then 'pair in srcTable, col2 in mytable'
             when max(in_m) = 1 and
                  max(max(in_s)) over (partition by col1) = 1
             then 'pair in myTable, col1 in srcTable'
             when max(in_m) = 1 and
                  max(max(in_s)) over (partition by col2) = 1
             then 'pair in myTable, col2 in srcTable'
             else 'solo pair'
        end)     
from ((select col1, col2, 1 as in_s, 0 as in_m 
       from tblSource
      ) union all
      (select cola, colb, 0 as in_s, 1 as in_m
       from myTable
      )
     ) x
group by col1, col2;

Здесь - это дБ <> скрипка.

1 голос
/ 24 марта 2020

Вы можете попробовать это.

SELECT 
    colA, colB, 
    CASE 
        WHEN C0 > 0 THEN 'both exist and associated'
        WHEN C0 = 0 AND C1 = 0 AND C2 = 0 THEN 'None exist'
        WHEN C0 = 0 AND C1 > 0 AND C2 = 0 THEN 'colA exist only'
        WHEN C0 = 0 AND C1 = 0 AND C2 > 0 THEN 'colB exist only'
        WHEN C0 = 0 AND C1 > 0 AND C2 > 0 THEN 'both exist, but not associated'
    END
FROM 
    ( SELECT T.colA, T.colB, 
        COUNT(*) C
        , COUNT(CASE WHEN T.colA = S.col1 AND T.colB = S.col2 THEN 1 END) C0
        , COUNT(CASE WHEN T.colA = S.col1 THEN 1 END) C1
        , COUNT(CASE WHEN T.colB = S.col2 THEN 1 END) C2
      FROM myTable T
            LEFT JOIN tblSource S ON T.colA = S.col1 or T.colB = S.col2
      GROUP BY T.colA, T.colB
    ) AS GRP

Результат:

colA                 colB                 
-------------------- -------------------- ------------------------------
foo2                 bar2                 both exist and associated
foo1                 bar3                 both exist, but not associated
foo5                 bar3                 colB exist only
foo6                 bar6                 None exist
0 голосов
/ 24 марта 2020

Примерно так:

-- direct match
SELECT *
FROM myTable A
INNER JOIN tblSource B
    ON A.[colA] = B.[col1]
    AND A.[colB] = B.[col2];

WITH DataSourceHasDirectMatch AS
(
    -- does not have direct match
    SELECT A.[colA]
          ,A.[colB]
    FROM myTable A
    LEFT JOIN tblSource B
        ON A.[colA] = B.[col1]
        AND A.[colB] = B.[col2]
    WHERE B.[col1] IS NULL
)
SELECT 'ColAMatches', a.colA, b.col2
FROM myTable A
INNER JOIN tblSource B
    ON A.[colA] = B.[col1]
WHERE A.[colA] IN (SELECT [ColA] FROM DataSourceHasDirectMatch)
UNION ALL
SELECT 'ColBMaches', a.[colB], b.col1
FROM myTable A
INNER JOIN tblSource B
    ON A.[colA] = B.[col1]
WHERE A.[colB] IN (SELECT [colB] FROM DataSourceHasDirectMatch)

enter image description here

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