如何组合此sql where子句以使用一个Select?

如何组合此sql where子句以使用一个Select?,sql,tsql,Sql,Tsql,因此,如果您查看最后一个WHERE子句其中inv\u location\u id位于其中一个我使用的是整数,另一个是集合 我怎样才能把这些结合起来 IF ( @inventory_location_id = NULL ) SELECT clinic_desc , dbo.fn_get_clinic_address_formatted(@application_name,

因此,如果您查看最后一个
WHERE
子句
其中inv\u location\u id位于
其中一个我使用的是
整数
,另一个是
集合

我怎样才能把这些结合起来

IF ( @inventory_location_id = NULL )
    SELECT  clinic_desc ,
            dbo.fn_get_clinic_address_formatted(@application_name,
                                                clinic_id, NULL, NULL,
                                                'STANDARD', NULL, NULL,
                                                NULL, NULL) AS formatted_address ,
            vfc_pin ,
            contact ,
            email_address ,
            phone ,
            fax
    FROM    dbo.clinics
    WHERE   clinic_id IN (
            SELECT  clinic_id
            FROM    dbo.clinic_inv_locations
            WHERE   inv_location_id IN (
                    SELECT  ilr.clinic_id
                    FROM    dbo.inv_location_reconciliation ilr
                    WHERE   inv_location_reconciliation_id = @reconciliation_id ) )

ELSE
    SELECT  clinic_desc ,
            dbo.fn_get_clinic_address_formatted(@application_name,
                                                clinic_id, NULL, NULL,
                                                'STANDARD', NULL, NULL,
                                                NULL, NULL) AS formatted_address ,
            vfc_pin ,
            contact ,
            email_address ,
            phone ,
            fax
    FROM    dbo.clinics
    WHERE   clinic_id IN (
            SELECT  clinic_id
            FROM    dbo.clinic_inv_locations
            WHERE   inv_location_id IN ( @inventory_location_id ) )

我喜欢复杂查询的CTE,因为我认为它使它们更容易阅读,所以我会做如下的事情。有很多其他的方法来解决这个问题,我不认为这是最快的

我还没有测试过,所以请小心操作


我还强烈地怀疑在这里使用函数是错误的选择。函数在SQL中非常糟糕,通常是性能和伸缩性差的原因。

我喜欢复杂查询的CTE,因为我认为它使它们更易于阅读,因此我将执行以下操作。有很多其他的方法来解决这个问题,我不认为这是最快的

我还没有测试过,所以请小心操作


我还强烈地怀疑在这里使用函数是错误的选择。函数在SQL中非常糟糕,通常是性能和伸缩性差的原因。

我喜欢复杂查询的CTE,因为我认为它使它们更易于阅读,因此我将执行以下操作。有很多其他的方法来解决这个问题,我不认为这是最快的

我还没有测试过,所以请小心操作


我还强烈地怀疑在这里使用函数是错误的选择。函数在SQL中非常糟糕,通常是性能和伸缩性差的原因。

我喜欢复杂查询的CTE,因为我认为它使它们更易于阅读,因此我将执行以下操作。有很多其他的方法来解决这个问题,我不认为这是最快的

我还没有测试过,所以请小心操作


我还强烈地怀疑在这里使用函数是错误的选择。函数在SQL中非常可怕,通常是性能和伸缩性差的原因。

只需更改位置即可

WHERE (
    (
        @inventory_location_id IS NULL AND (
            inv_location_id IN (
            SELECT  ilr.clinic_id
            FROM    dbo.inv_location_reconciliation ilr
            WHERE   inv_location_reconciliation_id = @reconciliation_id )
        )
    )
    OR
    (
        @inventory_location_id IS NOT NULL AND (
            inv_location_id IN ( @inventory_location_id )
        )
    )
)

它可以变得更简洁,但为了清晰起见,我把它放在了这里:)

只需更改位置即可

WHERE (
    (
        @inventory_location_id IS NULL AND (
            inv_location_id IN (
            SELECT  ilr.clinic_id
            FROM    dbo.inv_location_reconciliation ilr
            WHERE   inv_location_reconciliation_id = @reconciliation_id )
        )
    )
    OR
    (
        @inventory_location_id IS NOT NULL AND (
            inv_location_id IN ( @inventory_location_id )
        )
    )
)

它可以变得更简洁,但为了清晰起见,我把它放在了这里:)

只需更改位置即可

WHERE (
    (
        @inventory_location_id IS NULL AND (
            inv_location_id IN (
            SELECT  ilr.clinic_id
            FROM    dbo.inv_location_reconciliation ilr
            WHERE   inv_location_reconciliation_id = @reconciliation_id )
        )
    )
    OR
    (
        @inventory_location_id IS NOT NULL AND (
            inv_location_id IN ( @inventory_location_id )
        )
    )
)

它可以变得更简洁,但为了清晰起见,我把它放在了这里:)

只需更改位置即可

WHERE (
    (
        @inventory_location_id IS NULL AND (
            inv_location_id IN (
            SELECT  ilr.clinic_id
            FROM    dbo.inv_location_reconciliation ilr
            WHERE   inv_location_reconciliation_id = @reconciliation_id )
        )
    )
    OR
    (
        @inventory_location_id IS NOT NULL AND (
            inv_location_id IN ( @inventory_location_id )
        )
    )
)

它可以变得更简洁,但为了清晰起见,我把它放在了这里:)

这就是我最后要说的

DECLARE @temp TABLE (clinic_id INT )
IF(@reconciliation_id IS NOT NULL)
  INSERT INTO @temp SELECT ilr.clinic_id 
                    FROM dbo.inv_location_reconciliation ilr 
                    WHERE inv_location_reconciliation_id =@reconciliation_id
ELSE
  INSERT INTO @temp (clinic_id) VALUES (@inventory_location_id)
SELECT clinic_desc, dbo.fn_get_clinic_address_formatted(@application_name, clinic_id,      NULL, NULL, 'STANDARD', null,NULL, NULL, NULL) AS formatted_address,vfc_pin, contact, email_address, phone, fax 
FROM dbo.clinics 
WHERE clinic_id IN (SELECT clinic_id 
                    FROM dbo.clinic_inv_locations 
                    WHERE inv_location_id in (SELECT clinic_id FROM @temp))

这就是我最终要做的

DECLARE @temp TABLE (clinic_id INT )
IF(@reconciliation_id IS NOT NULL)
  INSERT INTO @temp SELECT ilr.clinic_id 
                    FROM dbo.inv_location_reconciliation ilr 
                    WHERE inv_location_reconciliation_id =@reconciliation_id
ELSE
  INSERT INTO @temp (clinic_id) VALUES (@inventory_location_id)
SELECT clinic_desc, dbo.fn_get_clinic_address_formatted(@application_name, clinic_id,      NULL, NULL, 'STANDARD', null,NULL, NULL, NULL) AS formatted_address,vfc_pin, contact, email_address, phone, fax 
FROM dbo.clinics 
WHERE clinic_id IN (SELECT clinic_id 
                    FROM dbo.clinic_inv_locations 
                    WHERE inv_location_id in (SELECT clinic_id FROM @temp))

这就是我最终要做的

DECLARE @temp TABLE (clinic_id INT )
IF(@reconciliation_id IS NOT NULL)
  INSERT INTO @temp SELECT ilr.clinic_id 
                    FROM dbo.inv_location_reconciliation ilr 
                    WHERE inv_location_reconciliation_id =@reconciliation_id
ELSE
  INSERT INTO @temp (clinic_id) VALUES (@inventory_location_id)
SELECT clinic_desc, dbo.fn_get_clinic_address_formatted(@application_name, clinic_id,      NULL, NULL, 'STANDARD', null,NULL, NULL, NULL) AS formatted_address,vfc_pin, contact, email_address, phone, fax 
FROM dbo.clinics 
WHERE clinic_id IN (SELECT clinic_id 
                    FROM dbo.clinic_inv_locations 
                    WHERE inv_location_id in (SELECT clinic_id FROM @temp))

这就是我最终要做的

DECLARE @temp TABLE (clinic_id INT )
IF(@reconciliation_id IS NOT NULL)
  INSERT INTO @temp SELECT ilr.clinic_id 
                    FROM dbo.inv_location_reconciliation ilr 
                    WHERE inv_location_reconciliation_id =@reconciliation_id
ELSE
  INSERT INTO @temp (clinic_id) VALUES (@inventory_location_id)
SELECT clinic_desc, dbo.fn_get_clinic_address_formatted(@application_name, clinic_id,      NULL, NULL, 'STANDARD', null,NULL, NULL, NULL) AS formatted_address,vfc_pin, contact, email_address, phone, fax 
FROM dbo.clinics 
WHERE clinic_id IN (SELECT clinic_id 
                    FROM dbo.clinic_inv_locations 
                    WHERE inv_location_id in (SELECT clinic_id FROM @temp))

请检查以下连接方法90%的代码与问题无关。请将SQL减少到最小,这样我们就不必费力地完成整个查询。看见而且我没有时间阅读90%的网页,而错误实际上就在第一行。谢谢你,但我知道了。我注意到你在()中使用了
IN
来应用
@inventory\u location\u id
参数。您不在那里使用
=
有什么特殊原因吗?请检查以下连接方法90%的代码与问题无关。请将SQL减少到最小,这样我们就不必费力地完成整个查询。看见而且我没有时间阅读90%的网页,而错误实际上就在第一行。谢谢你,但我知道了。我注意到你在()中使用了
IN
来应用
@inventory\u location\u id
参数。您不在那里使用
=
有什么特殊原因吗?请检查以下连接方法90%的代码与问题无关。请将SQL减少到最小,这样我们就不必费力地完成整个查询。看见而且我没有时间阅读90%的网页,而错误实际上就在第一行。谢谢你,但我知道了。我注意到你在()中使用了
IN
来应用
@inventory\u location\u id
参数。您不在那里使用
=
有什么特殊原因吗?请检查以下连接方法90%的代码与问题无关。请将SQL减少到最小,这样我们就不必费力地完成整个查询。看见而且我没有时间阅读90%的网页,而错误实际上就在第一行。谢谢你,但我知道了。我注意到你在()中使用了
IN
来应用
@inventory\u location\u id
参数。有没有什么特别的原因让你不在那里使用
=
?是的,返回的行应该总是少于50行。所以我不太担心。我对这个有点害怕。但没什么大不了的,我有一个很好的解决方案,但我把它分解为最基本的,我认为我会在我的编码选择中发现一些缺陷。但是我忘了你不能使用=NULL。一旦我把它改为空,我就得到了我所需要的。谢谢你的帮助。是的,返回的行应该总是少于50行。所以我不太担心。我对这个有点害怕。但没什么大不了的,我有一个很好的解决方案,但我把它分解为最基本的,我认为我会在我的编码选择中发现一些缺陷。但是我忘了你不能使用=NULL。一旦我把它改为空,我就得到了我所需要的。谢谢你的帮助。是的,返回的行应该总是少于50行。所以我不太担心。我对这个有点害怕。但没什么大不了的,我有一个很好的解决方案,但我把它分解为最基本的,我认为我会在我的编码选择中发现一些缺陷。但是我忘了你不能使用=NULL。一旦我把它改为空,我就得到了我所需要的。谢谢你的帮助。是的,返回的行应该总是少于50行。所以我不太担心。我