Sql 如果使用联接未找到记录,则返回NULL值

Sql 如果使用联接未找到记录,则返回NULL值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,下面是SQL查询,如果没有使用联接返回的记录,则返回空值 我的问题是: SELECT ISNULL((SELECT SR_No FROM Product WHERE SR_No in ('8877','9911')), NULL) 基本上,我需要检查sru No是否在产品表中可用 如何修改脚本以获得如下输出: 表格->项目: +-------+---------+ | SR_No | Asso_Id | +-------+-------

下面是SQL查询,如果没有使用联接返回的记录,则返回空值

我的问题是:

SELECT 
    ISNULL((SELECT SR_No
            FROM Product
            WHERE SR_No in ('8877','9911')), NULL)
基本上,我需要检查
sru No
是否在
产品
表中可用

如何修改脚本以获得如下输出:

表格->项目:

+-------+---------+
| SR_No | Asso_Id |
+-------+---------+
|  4455 |     100 |
|  4455 |     200 |
|  4455 |     300 |
|  8877 |     500 |
|  9911 |     600 |
+-------+---------+
| SR_No | Pro_N | Pro_Sc |
+-------+-------+--------+
|  4455 | SA    | S      |
|  8877 | BT    | B      |
|       |
+-------+-------+--------+
表格->产品:

+-------+---------+
| SR_No | Asso_Id |
+-------+---------+
|  4455 |     100 |
|  4455 |     200 |
|  4455 |     300 |
|  8877 |     500 |
|  9911 |     600 |
+-------+---------+
| SR_No | Pro_N | Pro_Sc |
+-------+-------+--------+
|  4455 | SA    | S      |
|  8877 | BT    | B      |
|       |
+-------+-------+--------+
预期产出:

+-------+-------+--------+
| SR_No | Pro_N | Pro_Sc |
+-------+-------+--------+
| 8877  | BT    | B      |
| NULL  | NULL  | NULL   |
+-------+-------+--------+

这看起来非常适合使用创建一个包含您要查找的项目的表,然后您可以
将产品(可能还有项目)表左键联接到该表中,以便有选择地显示其他列,或者如果不满足限定条件,则为空:

-- If you want the SR_No number listed along with NULLs
SELECT x.SR_No, p.Pro_N, p.Pro_Sc
FROM (values (8877),(1234)) as x(SR_No)
LEFT OUTER JOIN Product p
on x.SR_No = p.SR_No;
输出:

SR_No   Pro_N   Pro_Sc
8877    BT      B
1234    (null)  (null)
如果不想在空值旁边显示SR_No值:

-- If you want the SR_No listed as NULL instead
SELECT p.SR_No, p.Pro_N, p.Pro_Sc
FROM (values (8877),(1234)) as x(SR_No)
LEFT OUTER JOIN Product p
on x.SR_No = p.SR_No;
给予:

SR_No   Pro_N   Pro_Sc
8877    BT      B
(null)  (null)  (null)
第二种方法的问题是,如果存在多个非匹配项,则将显示多行
NULL
列,这对使用此查询的代码不太有用

如果需要进一步限定产品必须存在项目行,则调整查询:

LEFT OUTER JOIN Product p
on x.SR_No = p.SR_No AND EXISTS (SELECT 1 FROM Item_M i WHERE i.SR_No = p.SR_No);

这看起来非常适合使用创建您正在查找的项目的表,然后您可以
将产品(以及可能的项目)表左键联接到该表中,以便有选择地显示其他列,或者在不满足限定条件时为空:

-- If you want the SR_No number listed along with NULLs
SELECT x.SR_No, p.Pro_N, p.Pro_Sc
FROM (values (8877),(1234)) as x(SR_No)
LEFT OUTER JOIN Product p
on x.SR_No = p.SR_No;
输出:

SR_No   Pro_N   Pro_Sc
8877    BT      B
1234    (null)  (null)
如果不想在空值旁边显示SR_No值:

-- If you want the SR_No listed as NULL instead
SELECT p.SR_No, p.Pro_N, p.Pro_Sc
FROM (values (8877),(1234)) as x(SR_No)
LEFT OUTER JOIN Product p
on x.SR_No = p.SR_No;
给予:

SR_No   Pro_N   Pro_Sc
8877    BT      B
(null)  (null)  (null)
第二种方法的问题是,如果存在多个非匹配项,则将显示多行
NULL
列,这对使用此查询的代码不太有用

如果需要进一步限定产品必须存在项目行,则调整查询:

LEFT OUTER JOIN Product p
on x.SR_No = p.SR_No AND EXISTS (SELECT 1 FROM Item_M i WHERE i.SR_No = p.SR_No);
试试这个:

SELECT CASE WHEN SR_No IN ('8877','9911') THEN SR_No END AS SR_No,
       CASE WHEN SR_No IN ('8877','9911') THEN Pro_N END AS Pro_N,
       CASE WHEN SR_No IN ('8877','9911') THEN Pro_Sc END AS Pro_Sc
FROM Product

您可以通过输入子查询来代替
('8877','9911')

来修改它。请尝试以下操作:

SELECT CASE WHEN SR_No IN ('8877','9911') THEN SR_No END AS SR_No,
       CASE WHEN SR_No IN ('8877','9911') THEN Pro_N END AS Pro_N,
       CASE WHEN SR_No IN ('8877','9911') THEN Pro_Sc END AS Pro_Sc
FROM Product


您可以通过输入子查询来代替
('8877','9911')

来修改它。我不理解结果背后的逻辑。为什么要有一行空值?join在哪里?@SamiKuhmonen:我如何在这里使用join,基本上我需要检查产品表中的“SR_No”我仍然不明白-8877和9911在产品和
项目表中都有行。此外,如果您在
WHERE
中列出了10个产品,但没有一个“合格”,您是否希望有10行空值,或者您是否至少想列出
序号
我想这就是您想要的-是的,如果产品表中没有相应的序号,我可以添加除空值以外的自定义文本,但我不知道我要用什么样的逻辑才能做到这一点。。。感谢产品表中列出了8877和9911。另外,您根本没有使用Item表-这是必需的吗?我不理解结果背后的逻辑。为什么要有一行空值?join在哪里?@SamiKuhmonen:我如何在这里使用join,基本上我需要检查产品表中的“SR_No”我仍然不明白-8877和9911在产品和
项目表中都有行。此外,如果您在
WHERE
中列出了10个产品,但没有一个“合格”,您是否希望有10行空值,或者您是否至少想列出
序号
我想这就是您想要的-是的,如果产品表中没有相应的序号,我可以添加除空值以外的自定义文本,但我不知道我要用什么样的逻辑才能做到这一点。。。感谢产品表中列出了8877和9911。另外,您根本不使用Item表-需要这样做吗?