sql - 仅选择没有其他出现类型的行

标签 sql sql-server join left-join

我不确定如何解释这个问题,所以让我尝试用一​​个简化的示例。

我有两个表TicketsTicketEntities:

门票

tID | Customer |  Val
----|----------|------
1   | Paul     |  20
2   | Paul     |  10
3   | Peter    |  15
4   | Jane     |  100
5   | Doe      |  400
6   | John     |  5

票证实体

EntityID |  TicketID |   Type
---------|-----------|--------
1        |   1       |   1     
2        |   1       |   2
3        |   3       |   1
4        |   4       |   1
5        |   5       |   2
6        |   6       |   2

我想创建两个 View (如果可以有一个 View 的话最好如此):

  1. [已解决] 查看以向我显示 TicketEntity 类型为 1 的工单。我的工作解决方案: 期望的结果:

    tID   |   Customer  | Val | EntityID |  Type
    

    -----|-------------|-----|---------|-------- 1 |保罗| 20 | 1 | 1 3 |彼得| 15 | 15 3 | 1 4 |简| 100 | 100 4 | 1

    注意:不是实际的查询/结果

    SQL

    SELECT *
    FROM Tickets AS t
    LEFT JOIN TicketEntities AS e ON t.ID=e.TicketID WHERE e.EntityTypeId = 1 
    
  2. 仅查看 TicketEntity 类型为 2 而不是 1 的工单

    期望的结果:

    tID   |   Customer  | Val | EntityID |  Type
    ------|-------------|-----|----------|-------
    5     |     Doe     | 400 |  5       |   2
    6     |     John    | 5   |  6       |   2   
    

    SQL

    SELECT *
      FROM Tickets AS t
      LEFT JOIN TicketEntities AS e ON t.ID=e.TicketID WHERE e.EntityTypeId = 1 
    AND 
    NOT EXISTS (SELECT * 
      FROM dbo.Tickets AS t2
        INNER JOIN dbo.TicketEntities AS e2 ON t2.Id=e2.Ticket_Id 
        WHERE e2.EntityTypeId = 2)
    
  3. 或更佳地,单一 View :

    期望的结果:

    tID    |    Customer |  Val |  Entity_Type1 |  Entity_Type2
    -------|-------------|------|---------------|---------------
    1      |    Paul     |  20  |  1            |  2
    2      |    Paul     |  10  |               |
    3      |    Peter    |  15  |  1            |    
    4      |    Jane     |  100 |  1            |    
    5      |    Doe      |  400 |               |  2
    6      |    John     |  5   |               |  2  
    

    SQL

    我不知道该怎么做。自加入?

最后,欢迎对问题进行改进。解决这个问题的最佳方法是什么?

最佳答案

我认为从 Tickets 表到 TicketEntities 表的两个左联接应该在这里工作:

SELECT
    t.tID,
    t.Customer,
    t.Val,
    te1.Type,
    te2.Type
FROM Tickets t
LEFT JOIN TicketEntities te1
    ON t.tID = te1.TicketID AND te1.Type = 1
LEFT JOIN TicketEntities te2
    ON t.tID = te2.TicketID AND te2.Type = 2;

enter image description here

Demo

请仔细注意,我们不会对两个 TicketEntities 连接施加任何 WHERE 限制。这是为了确保我们不会过早过滤掉任何工单记录。

关于sql - 仅选择没有其他出现类型的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57375973/

相关文章:

sql - 30 天内再次访问

ruby-on-rails - 无法写入未知属性 `scrapbook_entry_id'

MySQL "Every derived table must have its own alias"

sql - 使SSDT仅生成一个SQL脚本(而不部署数据库)

sql-server - 将 Sql 中的行数转换为列格式

c# - 如何从发布在同一 EC2 服务器上的 ASP.NET 网站访问 EC2 服务器上的 SQL Server 2012?

mysql - 如何将表格从 1 行多列重组为多行少列?

mysql - 我一定要使用 SUM() 进行条件聚合吗?

mysql - 依赖于多个表的可更新 View

sql - 提高 postgreSQL 中简单左连接的性能