Sql server 2008 SQL-如果特定值的某些条件返回FALSE,则返回另一个值
有两个表Client和Stock: 它们将被视为由Client.IDC=Stock.IDC连接 讨论展示了如何将IDC分为以下两组: 类型为1且价格不为空的IDC,以及 剩余IDC,即没有类型为1的行的IDC 价格也不是零 对于第二组,如果发布=1,是否可以将IDC与价格一起返回?所需的输出应包含IDC,对于该IDC,不存在类型为1且价格不为NULL的行,但对于发布为1且价格不为NULL的行,该IDC可用 例如:Sql server 2008 SQL-如果特定值的某些条件返回FALSE,则返回另一个值,sql-server-2008,select,left-join,Sql Server 2008,Select,Left Join,有两个表Client和Stock: 它们将被视为由Client.IDC=Stock.IDC连接 讨论展示了如何将IDC分为以下两组: 类型为1且价格不为空的IDC,以及 剩余IDC,即没有类型为1的行的IDC 价格也不是零 对于第二组,如果发布=1,是否可以将IDC与价格一起返回?所需的输出应包含IDC,对于该IDC,不存在类型为1且价格不为NULL的行,但对于发布为1且价格不为NULL的行,该IDC可用 例如: Table Client IDC 1 2 3
Table Client
IDC
1
2
3
4
5
6
7
8
9
Table Stock
IDS IDC Type Issued Price
1 1 1 0 20
2 1 0 1 50
3 3 1 0 NULL
4 3 0 1 90
5 4 1 0 10
6 4 0 0 70
7 5 1 0 NULL
8 5 0 0 30
9 6 0 0 40
10 6 0 1 80
11 7 0 1 NULL
12 8 1 1 60
13 9 1 1 NULL
Desired return [IDC, Price]: [3,90], [6,80]
我的尝试没有成功:
SELECT C.IDC, S.Price
FROM Client C LEFT JOIN Stock S
ON C.IDC = S.IDC
AND S.Type = 1
AND S.Price IS NOT NULL
WHERE
S.IDC IS NULL
AND S.Issued = 1
我的假设是,WHERE子句中的第二个条件被WHERE子句中的第一个条件所冗余。然而,我真的搞不懂。我正在使用Microsoft SQL Server 2008。您可能正在查找此文件
SELECT C.IDC, S.Price
FROM Client C
LEFT JOIN Stock S ON C.IDC = S.IDC
WHERE
(S.IDC IS NULL AND S.Issued = 1) OR
(S.Type = 1 AND S.Price IS NOT NULL)
这就是你想要的吗
SELECT z.IDC, z.PRICE
FROM Stock z
WHERE z.IDC IN
(
SELECT c.IDC IDC
FROM [Client] c
LEFT JOIN Stock S
on C.IDC = S.IDC
AND S.Type = 1
AND S.Price IS NOT NULL
WHERE S.IDC IS NULL
) AND Z.PRICE IS NOT NULL AND z.Issued = 1
是的,事实上,它只能用股票书写,而无需与客户连接:
您将IDC标记为not null列IDC int,not null它怎么可能为null?S.IDC在哪里NULL@shadowsheep:IDC对于两个表中的每个表都不为空。但是,当使用LEFT JOIN时,C中可能有一些IDC,而S中可能没有。在这种情况下,S.IDC将为空。例如:C中可能有C.IDC=12,但S中没有S.IDC=12。是的,但如果由于左连接未命中而使S.IDC为null,则提供的数据不能使S.Issued=1,因为所有S行都为空null。无论如何,这是您想要的吗?选择z.IDC,z.PRICE FROM Stock z其中z.IDC不在选择[Client].[IDC]FROM[Client]c其中不存在从[Stock]s中选择1,其中c.[IDC]=s.IDC,s.[Type]=1,s.[PRICE]不为空,z.PRICE不为空,z.Issued=1,在这里,我们仍然得到一些应该排除的IDC,因为至少有一行Type=1,并且它们的Price不为NULL。
SELECT z.IDC, z.PRICE
FROM Stock z
WHERE z.IDC IN
(
SELECT c.IDC IDC
FROM [Client] c
LEFT JOIN Stock S
on C.IDC = S.IDC
AND S.Type = 1
AND S.Price IS NOT NULL
WHERE S.IDC IS NULL
) AND Z.PRICE IS NOT NULL AND z.Issued = 1
SELECT Z.IDC, Z.Price
FROM Stock Z
WHERE Z.IDC NOT IN
(
SELECT S.IDC
FROM Stock S
WHERE S.Type = 1 AND S.Price IS NOT NULL
)
AND Z.Issued = 1
AND Z.Price IS NOT NULL