Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询帮助-在连接条件中有两个where条件_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql SQL查询帮助-在连接条件中有两个where条件

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.

我有这些表格——账簿(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.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