按特定列获取与搜索行相关的行

Get rows which are related to the searched row, by specific column

我正在尝试对以下场景实施 sql 查询,

user_id nic_number reg_number full_name code
B123 12345 1212 John 123
B124 12346 1213 Peter 124
B125 12347 1214 Darln 125
B123 12345 1212 John 126
B123 12345 1212 John 127

在订阅者 table 中可以有具有相同 user_idnic_numberreg_numberfull_name 的行。但是代码不一样。

首先 -> 获取与我在查询中输入的 code 相同的用户(我已经为此实现了一个查询并且工作正常)

第二 -> 然后在该数据中我需要找到相关行(通过 nic_number reg_number 检查)并仅显示那些相关行。这意味着在下面的查询中我得到了 code = 123 的数据。其中会显示第一行的table。 但是我只需要为搜索到的 code 显示具有相同 nic_numberreg_number 的其余行一次。 这意味着 table.

的最后两行
select code,
GROUP_CONCAT(distinct trim(nic_number)) as nic_number,
GROUP_CONCAT(distinct trim(reg_number)) as reg_number,
GROUP_CONCAT(distinct trim(full_name)) as full_name from subscribers
where code like lower(concat('123')) group by code;

我需要通过更改上述查询来针对此场景实现 sql 查询。(只有一个查询,没有连接或触发器)。 我已经尝试了很长时间,但无法得到结果。如果你们中的任何人帮助我得到结果,那将非常有帮助。

我不确定您为什么指定“无连接”- 我知道您可能不想在 table 上设置触发器(无论如何您都不需要实现此目的),但是JOIN 是标准的 SQL 语法,可帮助您获得想要的结果。

尝试:

SELECT
s1.code, s1.nic_number, s1.reg_number, s1.full_name
FROM subscribers s1
INNER JOIN
(
    SELECT nic_number, reg_number
    FROM subscribers
    WHERE code = '123'
) s2
ON s1.nic_number = s2.nic_number
AND s1.reg_number = s2.reg_number
WHERE s1.code <> '123';

或者,如果您确实需要在完全没有 JOIN 的情况下实现它,那么您只需将需要包含的子查询加倍即可:

SELECT
s1.code, s1.nic_number, s1.reg_number, s1.full_name
FROM subscribers s1
WHERE s1.nic_number IN
(
    SELECT nic_number FROM subscribers
    WHERE code = '123'
)
AND s1.reg_number IN
(
    SELECT reg_number FROM subscribers
    WHERE code = '123'
)
AND s1.code <> '123';

后面的查询不一定理想,但还是达到了想要的结果

您可以将 nic 和 reg 号码组合成一个唯一的密钥来获取您的记录。

已编辑 只提取相关行而不是代码搜索的行, 顺便说一句,代码在订阅者中似乎不是唯一的 table。

select 
    code,
    trim(nic_number) as nic_number,
    trim(reg_number) as reg_number,
    trim(full_name) as full_name,
    trim(code) as code 
from 
    subscribers s1
where 
    code <> lower(trim('123')) 
    and trim(nic_number) + '|' + trim(reg_number) IN (
        select trim(nic_number) + '|' + trim(reg_number)
        from subscribers
        where code = lower(trim('123'))
    )