Mysql SQL查询帮助-在连接条件中有两个where条件
我有这些表格——账簿(b)、交易(t)、交易台(d)、交易对手(c) Trade(t)有两列:买方,卖方Mysql SQL查询帮助-在连接条件中有两个where条件,mysql,sql,sql-server,Mysql,Sql,Sql Server,我有这些表格——账簿(b)、交易(t)、交易台(d)、交易对手(c) Trade(t)有两列:买方,卖方 **Buyer** **Seller** B456 B222 C55 B222 B323 C4333 我必须根据买方和卖方列中的价值,将这些与书(b)合并。也就是说,如果值以“B”开头,则应在Books表中检查该id是否存在,例如:对于B456,应在Books表中检查id 456 我写了以下可以做到这一点: SELECT DISTINCT d.Name, t.Buyer, t.
**Buyer** **Seller**
B456 B222
C55 B222
B323 C4333
我必须根据买方和卖方列中的价值,将这些与书(b)合并。也就是说,如果值以“B”开头,则应在Books表中检查该id是否存在,例如:对于B456,应在Books表中检查id 456
我写了以下可以做到这一点:
SELECT DISTINCT d.Name, t.Buyer, t.Seller FROM Book AS b
INNER JOIN TradingDesk AS d ON b.TradingDeskId = d.Id
Join Trade as t
on substring(t.Seller,2,len(t.Seller)) = cast(b.Id as varchar)
UNION
SELECT DISTINCT d.Name , t.Buyer, t.Seller FROM Book AS b
INNER JOIN TradingDesk AS d ON b.TradingDeskId = d.Id
Join Trade as t
on substring(t.Buyer,2,len(t.Buyer)) = cast(b.Id as varchar)
现在,我需要检查交易对手(C)表中以“C”开头的值。我尝试向联接中添加where条件,但这不起作用,并且where语句中出现错误。
我尝试使用where条件调整连接条件:
on substring(t.Seller,2,len(t.Seller)) = cast(b.Id as varchar) where t.Seller like 'B%'
AND
substring(t.Seller,2,len(t.Seller)) = cast(c.partyId as varchar) where t.Seller like 'C%'
但似乎我不能在有多个where条件的部分中有两个条件
有没有办法做到这一点
谢谢
Mani将其转换为左连接,然后将附加条件放在那里
下面的查询很可能是次优的,但它应该为您提供必要的结果,从而至少为您提供了一个起点:
SELECT
d.Name,
t.Buyer,
t.Seller
FROM (
SELECT
'B' AS Prefix,
COUNT(Id AS varchar(20)) AS Id,
TradingDeskId
FROM Book
UNION ALL
SELECT
'C' AS Prefix,
COUNT(Id AS varchar(20)) AS Id,
TradingDeskId
FROM CounterParty
) bc
INNER JOIN TradingDesk d ON d.Id = bc.TradingDeskId
INNER JOIN Trade t ON bc.Prefix + bc.Id IN (t.Buyer, t.Seller)
您可以这样做(未经测试):
问题是,由于要加入的表是数据驱动的,因此不能在FROM子句中指定它 你的桌子设计有缺陷。你能换一下吗?并发布完整的查询加上错误。您可以在
ON
子句中有多个条件,但其中
不属于ON子句。将查询作为单独的问题发布在。如果有人能像我尝试的那样解决这个问题,我就把它留着。你能解释一下什么是交易对手吗?从您的设计来看,您似乎代表了两个项目之间的交易,每个项目可以是一本书,也可以是一个叫做“交易对手”的东西。是的,这很有帮助。但仍然无法从中得到我所需要的。我已经在上发布了另一个链接,以不同的方式解释这一点。我正在尝试探索这一点。但是,我需要图书表中的b.名称。正如我提到的,我有4张桌子。账簿、交易台、交易和交易对手。图书需要与TradingDesk合并,以获取TradingDesk名称和匹配的图书列表,这应用于检查。可以直接使用顾问。你可以看看这个链接,以及我把我的最新发展与此。谢谢。两处更正:(1)我想你的意思是用演员代替伯爵。(2) 在第二个select语句中,交易对手没有tradingdeskid列。所以,这是一个问题。@Mani:你的新问题包含了一个稍微不同(尽管非常相似)的模式,所以我宁愿继续关注这个问题,当(如果)它被重新打开时。至于这个答案,我将等待一段合理的时间,然后很可能删除它。无论如何,谢谢你指出这个答案的差异。我真傻,竟然用伯爵代替演员。
SELECT
d.Name,
t.Buyer,
t.Seller
FROM (
SELECT
'B' AS Prefix,
COUNT(Id AS varchar(20)) AS Id,
TradingDeskId
FROM Book
UNION ALL
SELECT
'C' AS Prefix,
COUNT(Id AS varchar(20)) AS Id,
TradingDeskId
FROM CounterParty
) bc
INNER JOIN TradingDesk d ON d.Id = bc.TradingDeskId
INNER JOIN Trade t ON bc.Prefix + bc.Id IN (t.Buyer, t.Seller)
select
t.Buyer,
t.Seller,
case when t.Buyer like 'B%' THEN (select BookName from Book where BookId = t.Buyer)
ELSE (select CpName from Counterparty where CPId = t.Buyer)
end BuyerName,
case when t.Seller like 'B%' THEN (select BookName from Book where BookId = t.Seller)
ELSE (select CpName from Counterparty where CPId = t.Seller)
end SellerName
from
Trade t