Sql 与内部联接一起使用时,子查询返回多个值

Sql 与内部联接一起使用时,子查询返回多个值,sql,subquery,Sql,Subquery,我使用带有内部联接的子查询,它返回10行,但我需要将这10行与另一个表匹配。 我该怎么做 以下是我的疑问: SELECT IT.IPTELM MOBILNO,TC.CDGACNTN GROUPACCOUNTNO, TC.CDCUSTN CUSTOMERNO, TC.PRCARDN, TC.CARDNO, TC.CRDIND, TC.Limit FROM CARDS.DBO.TOTAL_CDBS11801 TC INNER JOIN CARDS.DBO.I

我使用带有内部联接的子查询,它返回10行,但我需要将这10行与另一个表匹配。 我该怎么做

以下是我的疑问:

SELECT 
    IT.IPTELM MOBILNO,TC.CDGACNTN GROUPACCOUNTNO, TC.CDCUSTN CUSTOMERNO, 
    TC.PRCARDN, TC.CARDNO, TC.CRDIND, TC.Limit 
FROM 
    CARDS.DBO.TOTAL_CDBS11801 TC
INNER JOIN 
    CARDS.DBO.INPARTPF IT ON (SELECT DISTINCT CDCUSTN 
                              FROM CARDS.DBO.TOTAL_CDBS11801 
                              WHERE PRCARDN IN (SELECT PRCARDN 
                                                FROM CARDS.DBO.TOTAL_CDBS11801 
                                                WHERE CARDNO IN (SELECT * 
                                                                 FROM #T)) 
                                AND CRDIND ='P') = (IT.IPKIPN)

有什么想法吗?

你可以像下面这样做:

select T.* from (
    SELECT 
        IT.IPTELM MOBILNO,TC.CDGACNTN GROUPACCOUNTNO, TC.CDCUSTN CUSTOMERNO, 
        TC.PRCARDN, TC.CARDNO, TC.CRDIND, TC.Limit 
    FROM 
        CARDS.DBO.TOTAL_CDBS11801 TC
    INNER JOIN 
        CARDS.DBO.INPARTPF IT ON (SELECT DISTINCT CDCUSTN 
                                  FROM CARDS.DBO.TOTAL_CDBS11801 
                                  WHERE PRCARDN IN (SELECT PRCARDN 
                                                    FROM CARDS.DBO.TOTAL_CDBS11801 
                                                    WHERE CARDNO IN (SELECT * 
                                                                     FROM #T)) 
                                    AND CRDIND ='P') = (IT.IPKIPN)
) as T
inner join Table2 on your_join_condition

不要试图在你的网站上做任何事情,这就是WHERE子句的作用

SELECT 
    IT.IPTELM MOBILNO,TC.CDGACNTN GROUPACCOUNTNO, TC.CDCUSTN CUSTOMERNO, 
    TC.PRCARDN, TC.CARDNO, TC.CRDIND, TC.Limit 
FROM 
    CARDS.DBO.TOTAL_CDBS11801 TC
INNER JOIN 
    CARDS.DBO.INPARTPF IT 
    ON TC.CDCUSTN = (IT.IPKIPN)

WHERE TC.CARDNO IN (SELECT * FROM #T) AND TC.CRDIND ='P'
允许联接匹配要联接的列中的所有内容,然后使用适当的where子句过滤掉不需要的结果。您从ON子句中的子查询中获得多个“PRCARDN”

SELECT DISTINCT CDCUSTN 
    FROM CARDS.DBO.TOTAL_CDBS11801 
    WHERE PRCARDN IN (SELECT PRCARDN 
        FROM CARDS.DBO.TOTAL_CDBS11801 
        WHERE CARDNO IN (SELECT * FROM #T)) 
    AND CRDIND ='P'
这并不能保证给您一个单一的结果,事实上,我怀疑您是否希望,否则只有一行会有来自第二个表的数据,但您使用它的方式要求它在相等测试中返回单个值。只运行那个查询,如果它返回多个值,我打赌它可能会返回10个,因为你说#T中大约有10个值,你不能在等式测试中使用它

如果需要将结果连接到第三个表,这将成为一个子选择

SELECT 
    ss.IPTELM MOBILNO,ss.CDGACNTN GROUPACCOUNTNO, ss.CDCUSTN CUSTOMERNO, 
    ss.PRCARDN, ss.CARDNO, ss.CRDIND, ss.Limit 
FROM 
    (SELECT * 
        FROM CARDS.DBO.TOTAL_CDBS11801 TC
        INNER JOIN CARDS.DBO.INPARTPF IT 
        ON TC.CDCUSTN = (IT.IPKIPN)
        WHERE TC.CARDNO IN (SELECT * FROM #T) AND TC.CRDIND ='P') ss
INNER JOIN yourTable yt
ON ss.X = yt.Y
谢谢你的支持。 事实上,我的问题是,我想要一级卡号的手机号码和二级卡号的手机号码。 场景是我有两个表CARDS.DBO.TOTAL\u CDBS11801CARDS.DBO.INPARTPFCARDS.DBO.TOTAL_CDBS11801有“Sec_card_number”、“Pri_card_numb”和“Customer_number”等列,在该表中,“Sec_card_number”和“Pri_card_numb”的客户编号不同,因此我需要根据“Sec_card_number”提取“Pri_card_numb”,然后将该“Pri_card_numb”的“Customer_number”与另一个具有“Customer_number”和“Mobile_number”列的表CARDS.DBO.INPARTPF连接起来。 我已经使用下面的查询实现了所需的场景

SELECT SCD.SECONDARY_CARD_NUMBER,IT.IPTELM
FROM dbo.BI_SecondaryCardDetails SCD 
INNER JOIN CARDS.DBO.TOTAL_CDBS11801 SC ON SCD.SECONDARY_CARD_NUMBER=SC.CARDNO
INNER JOIN CARDS.DBO.TOTAL_CDBS11801 PC ON SC.PRCARDN=PC.CARDNO
INNER JOIN CARDS.DBO.INPARTPF IT ON PC.CDCUSTN=IT.IPKIPN

这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是
mysql
postgresql
sql server
oracle
还是
db2
-或其他完全不同的东西。我想您应该给我们一些关于预期输出的信息,以及它是如何成为您的正常数据的信息?我已经将其标记到sql,好心的check@HarunKARATAŞ我只想将子查询的结果连接到IPKIPN并获得结果。但这是上面发布的错误,我认为派生表或CTE对您更有意义。您在描述连接的同时,实际上以一种奇怪的方式使用连接条件。这里似乎没有TC和IT之间的关系,那么为什么要加入呢?它不起作用。仍然提供相同的errorSubquery返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。这是什么
#T