我不确定如何解释这个问题,所以让我尝试用一个简化的示例。
我有两个表Tickets和TicketEntities:
门票
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 的话最好如此):
[已解决] 查看以向我显示 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
仅查看 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)
或更佳地,单一 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;
Demo
请仔细注意,我们不会对两个 TicketEntities
连接施加任何 WHERE
限制。这是为了确保我们不会过早过滤掉任何工单记录。
关于sql - 仅选择没有其他出现类型的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57375973/