Sql 如果使用联接未找到记录,则返回NULL值
下面是SQL查询,如果没有使用联接返回的记录,则返回空值 我的问题是: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 | +-------+-------
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表-需要这样做吗?