将奇怪的SQL Server连接语法转换为MySQL语法
我有一个SQL Server查询,我正试图将其移植到MySQL,但是连接语法是我以前从未见过的。该查询是从一个用于测量过程代码使用情况的视图中进行的。刚刚超过T.PatID=P.ID的连接语法和第三个左外连接到底是怎么回事,我们可以在MySQL中使用什么等效语法?它根本不喜欢这种连接语法(忽略ISNULL并转换特定于SQL Server的语法) 提前感谢您的帮助。这里是一个类似的(简化的)查询,使用与第一个查询相同的结构。第二个查询移动连接以使内容更易于阅读将奇怪的SQL Server连接语法转换为MySQL语法,sql,sql-server,join,Sql,Sql Server,Join,我有一个SQL Server查询,我正试图将其移植到MySQL,但是连接语法是我以前从未见过的。该查询是从一个用于测量过程代码使用情况的视图中进行的。刚刚超过T.PatID=P.ID的连接语法和第三个左外连接到底是怎么回事,我们可以在MySQL中使用什么等效语法?它根本不喜欢这种连接语法(忽略ISNULL并转换特定于SQL Server的语法) 提前感谢您的帮助。这里是一个类似的(简化的)查询,使用与第一个查询相同的结构。第二个查询移动连接以使内容更易于阅读 set nocount on; u
set nocount on;
use tempdb;
go
declare @doc table (id int not null);
declare @tran table (id int not null, patid int not null);
declare @patients table (id int not null, docid int not null);
insert @doc (id) values (1);
insert @patients (id, docid) values (25, 1);
insert @tran (id, patid) values (100, 25)
select *
from @doc as pd
inner join @tran as t
inner join @patients as p
on t.patid = p.id
on pd.id = p.docid;
select *
from @tran as t
inner join @patients as p
on t.patid = p.id
inner join @doc as pd
on pd.id = p.docid;
其他事情看起来很奇怪。我不认为有必要加入约会,但我不会花太多时间去弄清楚逻辑和模式。convert的用法似乎不是检查null的好方法,除非有一个特殊的“flag”datetime值用作null的等价物。同样,您需要了解查询、查询的目标、查询所基于的模式以及如何填充表。坦率地说,这段代码引起了对整个系统质量的担忧。. 您的查询中有一些语法错误。Transactions.Code不存在并在where子句中使用。。。在表定义中。“创建表格ChargeDetails”和“创建表格约会”的开头有额外的逗号“,”。。。第一个联接没有条件:dbo.Doctors作为PD内部联接dbo.Transactions作为T(在上丢失)。。。在将其转换为MySQL之前,您需要修复这些错误。您从何处获得此查询?它是无效的tsql,不可能在SQL Server中工作,至少在我见过的所有版本中都是如此。我最初认为可能有一些简单的问题,比如缺少连接或输入错误,但正如@Sarhang指出的,那里有太多错误。如果我是你,我会丢弃这段代码,从头开始。@Sarhang,Alex这对sql server来说是完全有效的语法。不典型,但完全有效。只是一个普通的内部连接,从逻辑上讲,P和T之间的连接发生在PD和P之前。但是当您使用辅助表启动from子句时,需要这样的结构。将事务指定为from子句中的第一个表将更有意义。@3C41DC如果您不了解查询的作用以及它在sql server中的工作方式,则不可能迁移它。考虑到您引入的基本模式/命名错误,您应该得到一些帮助。我同意,与其试图弄清楚原始查询编写者到底在想什么,不如试试您的方法。谢谢你的帮助!
CREATE TABLE Doctors
(
ID int(10) NOT NULL PRIMARY KEY
, FullName varchar(50) DEFAULT NULL
)
CREATE TABLE Patients
(
LName varchar(50) DEFAULT NULL
, FName varchar(50) DEFAULT NULL
, ID int(10) NOT NULL PRIMARY KEY
)
CREATE TABLE Transactions
(
TranType varchar(2) DEFAULT NULL
, Code varchar(100) DEFAULT NULL
, TranSubType varchar(2) DEFAULT NULL
, Description varchar(2000) DEFAULT NULL
, TranDate datetime
, PatID int(10) DEFAULT NULL
, ID int(10) NOT NULL PRIMARY KEY
, TranAmt decimal(19,4) DEFAULT NULL
, ApptID int(10) DEFAULT NULL
, DoctorID int(10) DEFAULT NULL
)
CREATE TABLE ChargeDetails
(
DaysUnits varchar(50) DEFAULT NULL
-- DaysUnits is just an int ranging from 1 to 2
, ChargeTranID int(10) NOT NULL PRIMARY KEY
)
CREATE TABLE Appointments
(
DoctorID int(10) DEFAULT NULL
, PatientID int(10) DEFAULT NULL
, ScheduleDateTime datetime DEFAULT NULL
, ID int(10) NOT NULL PRIMARY KEY
)
set nocount on;
use tempdb;
go
declare @doc table (id int not null);
declare @tran table (id int not null, patid int not null);
declare @patients table (id int not null, docid int not null);
insert @doc (id) values (1);
insert @patients (id, docid) values (25, 1);
insert @tran (id, patid) values (100, 25)
select *
from @doc as pd
inner join @tran as t
inner join @patients as p
on t.patid = p.id
on pd.id = p.docid;
select *
from @tran as t
inner join @patients as p
on t.patid = p.id
inner join @doc as pd
on pd.id = p.docid;