Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL-如果特定值的某些条件返回FALSE,则返回另一个值_Sql Server 2008_Select_Left Join - Fatal编程技术网

Sql server 2008 SQL-如果特定值的某些条件返回FALSE,则返回另一个值

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

有两个表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
    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