【问题标题】:SQL query to find both 4 character and 6 character values from two tables从两个表中查找 4 个字符和 6 个字符的值的 SQL 查询
【发布时间】:2014-12-05 18:02:05
【问题描述】:

下面是我正在使用的两个表,以及表中的列:

**## 表格1 ##** 带有样本数据的受赠人列 受赠人 ---------- CLAT CLATX1 DJSD DJDX3 ADKS ADKSX5 大韩民国 **## 表 2 ##** 带样本数据的 Inact_ID 列 Inact_ID ---------- CLAT DJSD ADKS 大韩民国

使用以下查询:

SELECT DISTINCT A.GRANTEE           
FROM TABLE1 A             
WHERE                      
EXISTS(SELECT 1                     
        FROM TABLE2 B     
        WHERE A.GRANTEE= B.INACT_ID);
这些是我的结果: CLAT DJSD ADKS 大韩民国

返回 4 个字符 ID - 不是我想要的一切(还希望 6 个字符 ID 与 4 个字符 ID 相关联)

除了获得这 4 个字符 ID 之外,这 4 个字符 ID 中的一些还具有另一个具有以下命名约定的 ID - A02WXn,其中 X 是一个常数,n 是 0-9 之间的一个数字,即 6字符标识。我希望能够包含 6 个字符的 ID,如果它与 4 个字符的 ID 一起存在。 6 个字符的 ID 仅存在于表 1 中。

更新:我认为我可能更接近解决方案,希望这可以进一步阐明我想要的结果。

SELECT A.GRANTEE FROM TABLE1 A INNER JOIN (SELECT B.INACT_ID FROM INACTIVE_USERS B) ON A.GRANTEE LIKE '%' || B.INACT_ID || '%';

(注意 - 这是在 Postgres 上完成的,并且有效,但我无法让它在 DB2 中运行) 来自 Postgres 的结果如下:(期望的结果 - 如果存在 4 个字符 ID 和 6 个字符 ID) 受赠人 -------- CLAT CLATX1 DJSD DJDX3 ADKS ADKSX5 大韩民国

【问题讨论】:

  • ...WHERE LEFT( A.GRANTEE, 4 ) = B.INACT_ID 怎么样?
  • Artjom B. - 感谢您的编辑。 mustaccio - 我很感激你的回应!当我编辑 WHERE CLAUSE 以匹配您所拥有的内容时,我得到不正确的结果。我返回的 ROWS 不仅仅是 4 或 6 个字符。我只想要 4 个字符 ID 及其相关的 6 个字符 ID(如果存在)。谢谢
  • 那你需要提供更有意义的样本数据,包括例外情况。我的建议将与您现有的示例完美配合。
  • Mustaccio - 我更新了更多信息。我希望这会有所帮助。
  • 我能够在两个表中匹配前 4 个字符位置,但我只希望结果集始终包含 4 个字符 ID 及其关联的 6 个字符 ID(如果存在)。我不希望返回除 4 个字符(ASDF)或 6 个字符(ASDFXn ID's)以外的其他值,如果它们与关联的 4 个字符 ID 一起存在的话。现在,只要前 4 个字符匹配,无论它们有多少个字符,我都会得到值。我觉得我更接近了,但仍然无法弄清楚这一点。我只需要 ASDF 和 ASDFXn ID。仅返回 4 或 6 个字符。这有助于澄清吗?

标签: sql database db2


【解决方案1】:

试试下面的 SQL:

SELECT DISTINCT A.GRANTEE           
FROM TABLE1 A             
WHERE                      
EXISTS(SELECT 1                     
        FROM TABLE2 B     
        WHERE substring(A.GRANTEE,1,4)= B.INACT_ID);

我在 Sybase DB 中尝试过同样的事情。效果很好!

create table #temp1
(
GRANTEE varchar(125)
)
insert into #temp1 values('A02W')
insert into #temp1 values('A02WX2')
insert into #temp1 values('DBDS')
insert into #temp1 values('DBDSX4')
insert into #temp1 values('A03')
insert into #temp1 values('ASKDLAKDJD')

create table #temp2
(
INACT_ID varchar(4)
)
insert into #temp2 values('A02W')
insert into #temp2 values('AAAB')
insert into #temp2 values('AVCD')
insert into #temp2 values('SSLD')

select * from  #temp1
select * from  #temp2


SELECT DISTINCT A.GRANTEE           
FROM #temp1 A             
WHERE                      
EXISTS(SELECT 1                     
        FROM #temp2 B     
        WHERE substring(A.GRANTEE,1,4) = B.INACT_ID);

【讨论】:

  • 如果我使用 Substr(A.GRANTEE,1,4)=B.INACT_ID 子句,我会得到返回的行,而不仅仅是 4 和 6 个字符,就像我追求的那样。如果这有助于澄清,我改写并添加了一些更新到我的原始帖子。很抱歉有任何混淆。感谢您的意见!
  • 谢谢!如果已解决,请将其标记为答案。
  • 您提供的查询不适用于我试图检索的内容。
  • 我没有在表 1 的源数据中看到 CLATX2。怎么会有预期的结果?你能解释一下吗?因为我正在尝试类似的数据并且我得到以下结果:CLAT CLATX1 DJSD DJSDX3 ADKS ADKSX5 DKHS
  • 很抱歉给您带来了困惑。那是一个错字。它应该是 CLATX1。我更新了那个。 WHERE EXISTS(SELECT 1 FROM #temp2 B WHERE substring(A.GRANTEE,1,4) = B.INACT_ID);所以 substring 函数仍然限定包含前四个字符的行,以及可能在这之后的任何其他字符?例如,结果 - CLAT CLATX1 CLAT4IDKSAKA CLATSHDFSDHF CLATAHAHAHAHAJAJAJA
猜你喜欢
  • 2019-08-13
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2011-12-21
相关资源
最近更新 更多