基于另一个表的SQL查询

发布于 2025-01-24 23:48:01 字数 1234 浏览 5 评论 0原文

我有这样的桌子:

表1:

fnameID1FID
面包xyz18bread
ABC45
鱼面包_OLDBNQ18bread_old
bacontbg77bacon
鸡蛋CGS99EGGS
BANANABHGBANANA18

表2:

FNAMEFID
BREAD18
FID BREAD 18 FIFE BARD 18 FISH45
BAECON77
鸡蛋99

目前搜索了一个简单的搜索,表1要找到食物的ID如下:

SELECT ID1 
FROM TABLE1
WHERE NAME IN NAME_LIST

因此,例如,当名称列表为:{'Bread','Fish)时,然后返回ABC XYZ。问题在于,这是一个较旧版本的具有相同ID的“ Bread_old”。 (18)

我需要更改此操作,因此现在搜索是基于食物的FID而不是名称进行的,以找到受影响的食物,但我无法更改输入。

例如:给定食物列表:(“面包”,“鱼”)

结果应该是XYZ,ABC,BNQ(因为面包与表1中的BNQ相匹配,在表1中与BNQ匹配)

如何可以做到这一点?我认为我需要使用JOIN或进行“选择中的选择”,但我不确定如何与多个输入一起使用。

编辑:oracle是数据库 编辑2:将Banana18添加到表1中,需要领先匹配

I have tables like this:

table 1:

FNAMEID1FID
BREADXYZ18BREAD
FISHABC45FISH
BREAD_OLDBNQ18BREAD_OLD
BACONTBG77BACON
EGGSCGS99EGGS
BANANABHGBANANA18

table 2:

FNAMEFID
BREAD18
FISH45
BACON77
EGGS99

currently a simple search is done on table 1 to find id's of food as follows:

SELECT ID1 
FROM TABLE1
WHERE NAME IN NAME_LIST

so for example when the name list is: ('BREAD','FISH') then it returns XYZ, ABC. The problem is this misses 'BREAD_OLD' which is an older version with the same ID. (18)

I need to change this so now the search is done based on the FID of food rather than the NAME to find affected foods but I cannot change the input.

eg: given a list of foods: ('BREAD', 'FISH')

the result should be XYZ, ABC, BNQ (because BREAD matches 18 which matches BNQ in table 1)

how can this can be done? I think I need to use a join or do a 'select within a select' but I'm not sure how this would work with multiple inputs.

edit: ORACLE is the database
edit 2: adding BANANA18 to table 1, needs to be leading match

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

故人爱我别走 2025-01-31 23:48:01

正确的解决方案是在FID字段上链接。但是,Table1上的FID字段似乎将ID与名称相连。因此,解决方案将是从该字段提取数字值,然后将其链接到表2上的FID字段。例如:

SELECT t1.FNAME, t1.ID1
FROM table1 t1 
INNER JOIN table2 t2 ON t2.FID = regexp_replace(t1.FID, '^[^0-9]', '')
WHERE 
t2.FNAME IN ('BREAD','FISH');

The correct solution would be to link on the FID fields. However, the FID field on table1 seems to concatenate the ID with the name. The solution would therfore be to extract the numeric value from that field and then use that to link it to the FID field on table 2. For example:

SELECT t1.FNAME, t1.ID1
FROM table1 t1 
INNER JOIN table2 t2 ON t2.FID = regexp_replace(t1.FID, '^[^0-9]', '')
WHERE 
t2.FNAME IN ('BREAD','FISH');
南笙 2025-01-31 23:48:01

假设table1.fid等于table2.fidtable1.fname串联,那么您不需要(慢)正则表达式,并且可以使用简单平等与字符串串联结合:

SELECT t1.FNAME,
       t1.ID1
FROM   table1 t1 
       INNER JOIN table2 t2
       ON t1.FID = t2.fid || t1.fname
WHERE  t2.FNAME IN ('BREAD','FISH');

对于示例数据:

CREATE TABLE table1 (FNAME, ID1, FID) AS
SELECT 'BREAD',     'XYZ', '18BREAD'  FROM DUAL UNION ALL
SELECT 'FISH',      'ABC', '45FISH'   FROM DUAL UNION ALL
SELECT 'BREAD_OLD', 'BNQ', '18BREAD_OLD' FROM DUAL UNION ALL
SELECT 'BACON',     'TBG', '77BACON'  FROM DUAL UNION ALL
SELECT 'EGGS',      'CGS', '99EGGS'   FROM DUAL UNION ALL
SELECT 'BANANA',    'BHG', 'BANANA18' FROM DUAL UNION ALL
SELECT 'TOAST',     'TST', 'TOAST181' FROM DUAL;

CREATE TABLE table2 (FNAME, FID) AS
SELECT 'TOAST', 181 FROM DUAL UNION ALL
SELECT 'BREAD',  18 FROM DUAL UNION ALL
SELECT 'FISH',   45 FROM DUAL UNION ALL
SELECT 'BACON',  77 FROM DUAL UNION ALL
SELECT 'EGGS',   99 FROM DUAL;

输出:

fnameid1
面包xyz
bread_oldBNQ
ABC

db<>

Assuming that table1.FID equals table2.FID concatenated with table1.FNAME then you do not need (slow) regular expressions and can use a simple equality combined with string concatenation:

SELECT t1.FNAME,
       t1.ID1
FROM   table1 t1 
       INNER JOIN table2 t2
       ON t1.FID = t2.fid || t1.fname
WHERE  t2.FNAME IN ('BREAD','FISH');

Which, for the sample data:

CREATE TABLE table1 (FNAME, ID1, FID) AS
SELECT 'BREAD',     'XYZ', '18BREAD'  FROM DUAL UNION ALL
SELECT 'FISH',      'ABC', '45FISH'   FROM DUAL UNION ALL
SELECT 'BREAD_OLD', 'BNQ', '18BREAD_OLD' FROM DUAL UNION ALL
SELECT 'BACON',     'TBG', '77BACON'  FROM DUAL UNION ALL
SELECT 'EGGS',      'CGS', '99EGGS'   FROM DUAL UNION ALL
SELECT 'BANANA',    'BHG', 'BANANA18' FROM DUAL UNION ALL
SELECT 'TOAST',     'TST', 'TOAST181' FROM DUAL;

CREATE TABLE table2 (FNAME, FID) AS
SELECT 'TOAST', 181 FROM DUAL UNION ALL
SELECT 'BREAD',  18 FROM DUAL UNION ALL
SELECT 'FISH',   45 FROM DUAL UNION ALL
SELECT 'BACON',  77 FROM DUAL UNION ALL
SELECT 'EGGS',   99 FROM DUAL;

Outputs:

FNAMEID1
BREADXYZ
BREAD_OLDBNQ
FISHABC

db<>fiddle here

中性美 2025-01-31 23:48:01

示例数据:

SELECT * FROM TABLE1;

FNAME     ID1   FID
-------------------------
BREAD     XYZ   18BREAD
FISH      ABC   45FISH 
BACON     TBG   77BACON
EGGS      CGS   99EGGS 
BREAD_OLD BNQ   18BREAD_OLD

SELECT * FROM TABLE2;

FNAME  FID
----------
BREAD   18
FISH    45
BACON   77
EGGS    99

查询:

在查询中,我们在FID上加入Table1和Table2(使用REGEX_SUBSTR提取table1 fid的第一个n数字),因此行'bread_old'将与table2中的行'bread'一起连接,当我们添加条件fname时('面包')将选择“面包”和“面包_old”的ID1。

SELECT ID1
FROM
(SELECT
TO_NUMBER(REGEXP_SUBSTR(FID,'^[0-9]{1,}'),'9999') AS FID,FNAME,ID1
FROM TABLE1)V
JOIN TABLE2 T
ON (V.FID=T.FID)
WHERE T.FNAME IN ('BREAD','FISH')

结果:

ID1
---
XYZ
ABC
BNQ

Sample data:

SELECT * FROM TABLE1;

FNAME     ID1   FID
-------------------------
BREAD     XYZ   18BREAD
FISH      ABC   45FISH 
BACON     TBG   77BACON
EGGS      CGS   99EGGS 
BREAD_OLD BNQ   18BREAD_OLD

SELECT * FROM TABLE2;

FNAME  FID
----------
BREAD   18
FISH    45
BACON   77
EGGS    99

Query:

In query we join TABLE1 and TABLE2 on FID (using REGEX_SUBSTR to extract first n numbers of TABLE1 FID) so row 'BREAD_OLD' will be joined with row 'BREAD' from TABLE2 and when we add condition FNAME IN ('BREAD') both ID1 of 'BREAD' AND 'BREAD_OLD' will be selected.

SELECT ID1
FROM
(SELECT
TO_NUMBER(REGEXP_SUBSTR(FID,'^[0-9]{1,}'),'9999') AS FID,FNAME,ID1
FROM TABLE1)V
JOIN TABLE2 T
ON (V.FID=T.FID)
WHERE T.FNAME IN ('BREAD','FISH')

Result:

ID1
---
XYZ
ABC
BNQ
孤千羽 2025-01-31 23:48:01

一个选项是通过匹配Table2与提取的子字符串的串联列加入表,直至 _ _ fid> fid column table1例如

 SELECT id1
   FROM table1 t1
   JOIN table2 t2
     ON REGEXP_SUBSTR(t1.fid,'[^_]+') = t2.fid||t2.fname
  WHERE t2.fname IN ('BREAD','FISH')

One option is joining the tables by matching concatenated columns of table2 with the extracted substrings upto _ character for fid column of table1 such as

 SELECT id1
   FROM table1 t1
   JOIN table2 t2
     ON REGEXP_SUBSTR(t1.fid,'[^_]+') = t2.fid||t2.fname
  WHERE t2.fname IN ('BREAD','FISH')

Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文