Sql server 检查左联接表中的记录是否至少存在一次

Sql server 检查左联接表中的记录是否至少存在一次,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个Images、Orders和OrderItems表,我想匹配任何图像,如果用户已经购买了任何图像,则通过在IsBund列中显示true或false作为参数传递 当我使用这种情况时,当我有副本时,当物品已经购买,其中IsBuy为真,副本为假。 如果项目从未购买过,则没有重复项,IsBund仅等于False 有没有办法让iSBuind设置为true或false,而不是重复的图像,只显示一行 我想要这样的东西: -----------------------------------------

我有一个Images、Orders和OrderItems表,我想匹配任何图像,如果用户已经购买了任何图像,则通过在IsBund列中显示true或false作为参数传递

当我使用这种情况时,当我有副本时,当物品已经购买,其中IsBuy为真,副本为假。 如果项目从未购买过,则没有重复项,IsBund仅等于False

有没有办法让iSBuind设置为true或false,而不是重复的图像,只显示一行

我想要这样的东西:

----------------------------------------------------------------------------
| Id   |  Title  | Description | Location | PriceIT |  Location | IsBought | 
----------------------------------------------------------------------------
| 1   |  Eiffel Tower  | .... | ...... | 20.0      |  Paris     | true    |
----------------------------------------------------------------------------
| 2   |  Tore di Pisa  | .... | ...... | 20.0      |  Italia     | false  |
---------------------------------------------------------------------------
| etc ......
---------------------------------------------------------------------------

您的查询逻辑看起来可疑。很少看到连接只包含从未处理表到参数的列的比较。我怀疑你根本不需要加入用户,因为你似乎关注的是一个人买的东西,而不是同一个人的名字作者所创造的东西。没有聚合的GROUPBY子句通常是对逻辑上有缺陷的查询的掩盖

所以重新开始。显然,您希望看到所有图像。对于每个人,您只想知道该图像是否与给定人物的任何顺序相关联

select img.*, -- you would, or course, only select the columns needed 

   (select count(*) from Sales.SalesOrderDetail as orddet 
    where orddet.ProductID = img.ProductID) as [Order Count],

   (select count(*) from Sales.SalesOrderDetail as orddet 
    inner join Sales.SalesOrderHeader as ord 
       on orddet.SalesOrderID = ord.SalesOrderID
    where orddet.ProductID = img.ProductID
    and ord.CustomerID = 29620
    ) as [User Order Count], 

    case when exists(select * from Sales.SalesOrderDetail as orddet 
    inner join Sales.SalesOrderHeader as ord 
       on orddet.SalesOrderID = ord.SalesOrderID
    where orddet.ProductID = img.ProductID
    and ord.CustomerID = 29620) then 1 else 0 end as [Has Ordered] 

from Production.ProductProductPhoto as img 
where img.ProductID between 770 and 779
order by <something useful>;
注意别名——当您使用较短但仍然可以理解的别名(即,不是单个字母)时,阅读长查询要容易得多。我已经包含了3个不同的子查询,以帮助您了解相关性,以及如何构建逻辑以实现目标,并帮助调试发现的任何问题


这是基于AdventureWorks示例数据库的,您应该将其安装并用作学习工具,并使用公共数据源帮助促进与其他人的讨论。请注意,我只是选择了一个随机的客户ID值——您可以使用您的参数。我将查询过滤到一系列图像以简化调试。这些都是帮助编写和调试sql的非常简单但有效的方法

您需要提供一些示例数据和所需的输出。我添加了一些关于表结构和所需输出的细节。在这里使用GROUPBY有什么意义?你没有任何聚合。我的错,在原始请求中我有一些聚合。。可能会让人困惑谢谢你,你的例子真的帮助我理解了我的错误并解决了我的问题。我从Orders和OrderItems表中删除了左连接,并在存在时放入您的案例。成功了!
----------------------------------------------------------------------------
| Id   |  Title  | Description | Location | PriceIT |  Location | IsBought | 
----------------------------------------------------------------------------
| 1   |  Eiffel Tower  | .... | ...... | 20.0      |  Paris     | true    |
----------------------------------------------------------------------------
| 2   |  Tore di Pisa  | .... | ...... | 20.0      |  Italia     | false  |
---------------------------------------------------------------------------
| etc ......
---------------------------------------------------------------------------
select img.*, -- you would, or course, only select the columns needed 

   (select count(*) from Sales.SalesOrderDetail as orddet 
    where orddet.ProductID = img.ProductID) as [Order Count],

   (select count(*) from Sales.SalesOrderDetail as orddet 
    inner join Sales.SalesOrderHeader as ord 
       on orddet.SalesOrderID = ord.SalesOrderID
    where orddet.ProductID = img.ProductID
    and ord.CustomerID = 29620
    ) as [User Order Count], 

    case when exists(select * from Sales.SalesOrderDetail as orddet 
    inner join Sales.SalesOrderHeader as ord 
       on orddet.SalesOrderID = ord.SalesOrderID
    where orddet.ProductID = img.ProductID
    and ord.CustomerID = 29620) then 1 else 0 end as [Has Ordered] 

from Production.ProductProductPhoto as img 
where img.ProductID between 770 and 779
order by <something useful>;