Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
将奇怪的SQL Server连接语法转换为MySQL语法_Sql_Sql Server_Join - Fatal编程技术网

将奇怪的SQL Server连接语法转换为MySQL语法

将奇怪的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

我有一个SQL Server查询,我正试图将其移植到MySQL,但是连接语法是我以前从未见过的。该查询是从一个用于测量过程代码使用情况的视图中进行的。刚刚超过T.PatID=P.ID的连接语法和第三个左外连接到底是怎么回事,我们可以在MySQL中使用什么等效语法?它根本不喜欢这种连接语法(忽略ISNULL并转换特定于SQL Server的语法)

提前感谢您的帮助。

这里是一个类似的(简化的)查询,使用与第一个查询相同的结构。第二个查询移动连接以使内容更易于阅读

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;