SQL выберите столбцы таблицы, сопоставив таблицу 1 с двумя условиями в таблице 2 - PullRequest
0 голосов
/ 11 июля 2020

Я хотел бы получить совпадения из двух таблиц со следующими критериями:

  1. Получить столбцы из Table_A и Table_B, где A.some_name = B.j_name
Table_A:
**AB  some_name     G_NAME      Status        some_time**
------------------------------------------------------------
AAA    Job1        xxxxxxxxx   Ended OK    2020-06-29 10:37:52
AAA    Job2        xxxxxxxxx   Ended OK    2020-06-29 10:37:52
BBB    AB-Job1     xxxxxxxxx   Ended OK    2020-06-29 10:37:52
BBB    AB-Job2     xxxxxxxxx   Ended OK    2020-06-29 10:37:52
BBB    AB-Job3     xxxxxxxxx   Ended OK    2020-06-29 10:37:52
Table_B:
**RM  j_name           desc            rand_time**
----------------------------------------------------
111   Job1            Sometext    2020-06-29 06:30:51
111   AB-Job1         Sometext1   2020-06-29 09:31:52
222   AB-Job5         Sometext2   2020-06-29 09:34:11
222   DPF-AB-Job2     Sometext3   2020-06-29 03:39:33
222   DPF-AB-Job3     Sometext4   2020-06-29 11:32:23
SELECT a.some_name, a.some_time ,b.desc
FROM TableA a
LEFT JOIN Table_B b
ON a.some_name = b.j_name 
where a.some_name like 'AB-%'

Теперь я хотел бы выбрать AB-Job2 and AB-Job3 из Table_A и сопоставить его с DPF-AB-Job2 and DPF-AB-Job3 Table_B в том же операторе select. Как мне сделать sh это?

Ответы [ 2 ]

4 голосов
/ 11 июля 2020

Используйте IN() для сопоставления нескольких значений и используйте конкатенацию строк для генерации другого возможного значения.

SELECT *
FROM TableA a
LEFT JOIN Table_B b
ON b."j_name" IN (a."some_name", 'DPF-' || a."some_name")
where a."some_name" like 'AB-%';

DEMO

2 голосов
/ 11 июля 2020

Учитывая, что вы хотите сохранить оба набора данных и что вы выполняете левое соединение, тогда

SQL> create table table_a ( code varchar2(3) , name varchar2(10) , g_name varchar2(100) default 'xxxxxxxxx' ) ;

SQL> create table table_b ( othercode varchar2(3) , name varchar2(20) , description varchar2(40) default 'yyyyyyy' )
  2  ;

После вставки некоторых записей для примера

SQL> select * from table_a ;

COD NAME       G_NAME
--- ---------- --------------------
AAA Job2       xxxxxxxxx
AAA AB-Job1    xxxxxxxxx
AAA AB-Job2    xxxxxxxxx
AAA AB-Job3    xxxxxxxxx

SQL> select * from table_b ;

OTH NAME                 DESCRIPTION
--- -------------------- ----------------------------------------
111 Job1                 yyyyyyy
112 AB-Job1              yyyyyyy
113 AB-Job5              yyyyyyy
114 DPF-AB-Job2          yyyyyyy
115 DPF-AB-Job3          yyyyyyy

SQL>

Теперь, если мы запускаем ваш запрос:

SQL> SELECT a.code, b.othercode, a.name, b.name ,b.description
FROM table_a a
LEFT JOIN table_b b
ON a.name = b.name
where a.name like 'AB-%'  2    3    4    5  ;

COD OTH NAME       NAME                 DESCRIPTION
--- --- ---------- -------------------- ----------------------------------------
AAA 112 AB-Job1    AB-Job1              yyyyyyy
AAA     AB-Job2
AAA     AB-Job3

SQL>

вы получаете все записи из table_b, которые соответствуют условию, плюс все записи из table_a, которые не соответствуют. Если вам нужны записи, соответствующие другому условию, вы можете использовать UNION.

SELECT a.code, b.othercode, a.name, sysdate ,b.description
FROM table_a a
LEFT JOIN table_b b
ON a.name = b.name
where a.name like 'AB-%'
union
SELECT a.code, b.othercode, a.name, sysdate ,b.description
FROM table_a a
LEFT JOIN table_b b
ON a.name = replace(b.name,'DPF-','')
where a.name like 'AB-%'

COD OTH NAME       SYSDATE   DESCRIPTION
--- --- ---------- --------- ----------------------------------------
AAA 112 AB-Job1    11-JUL-20 yyyyyyy
AAA 114 AB-Job2    11-JUL-20 yyyyyyy
AAA 115 AB-Job3    11-JUL-20 yyyyyyy
AAA     AB-Job2    11-JUL-20
AAA     AB-Job3    11-JUL-20

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

 SELECT a.code, b.othercode, a.name, sysdate ,b.description
  2  FROM table_a a
  3  JOIN table_b b
  4  ON a.name = b.name
  5  where a.name like 'AB-%'
  6  union
  7  SELECT a.code, b.othercode, a.name, sysdate ,b.description
  8  FROM table_a a
  9  JOIN table_b b
 10  ON a.name = replace(b.name,'DPF-','')
 11* where a.name like 'AB-%'
SQL> /

COD OTH NAME       SYSDATE   DESCRIPTION
--- --- ---------- --------- ----------------------------------------
AAA 112 AB-Job1    11-JUL-20 yyyyyyy
AAA 114 AB-Job2    11-JUL-20 yyyyyyy
AAA 115 AB-Job3    11-JUL-20 yyyyyyy

SQL>

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

...