DBF 数据库条件连接正确语法 DBF - 已编辑
DBF database conditional join correct syntax DBF - edited
我有 4 个 table(ROUTBOM、HARD、MAT、ROUT)。在主 table ROUTBOM 中,我有 ID、PROD_NO 和 TYPE 列。我必须根据 TYPE 和(ID 或 PROD_NO)select。条件如下。这可以用内部连接来实现吗 - 在连接之前有条件?
数据库是 FoxPro
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\test\Data"))
数据:
ROUTBOM
id qty prod_no Type Name
20322 0.15000 2 ??? get name from HARD
2.00000 0066773 4 ??? get name from ROUT
37500 4.00000 2 ??? get name from HARD
29750 4.00000 1 ??? get name from MAT
困难TABLE
ID NAME
20322 H68NK0005
37500 HAS2-30XX-H HYBRID POWDER
垫子TABLE
ID NAME
29750 NEOPRENE (McMASTER 8694K61)
02125 SPRING STEEL STRIP .008'' X .50'' X 60''
溃败TABLE
ID NAME
0066773 L.V. DOOR ARC PROOF J4
000198 DEVEL. L.V. DOOR J4
需要输出
id qty prod_no Type Name
20322 0.15000 2 H68NK0005
2.00000 0066773 4 L.V. DOOR ARC PROOF J4
37500 4.00000 2 HAS2-30XX-H HYBRID POWDER
29750 4.00000 1 NEOPRENE (McMASTER 8694K61)
查询:
条件:
if id is not null and type 2 JOIN ROUTBOM.id with MAT.id to get the name of material
if id is not null and type 1 JOIN ROUTBOM.id with HARD.id to get the name of hadware
if id is empty and type 4 JOIN ROUTBOM.prod_no with ROUT.id to get the name of part
可以一次查询完成吗?我不知道必须在哪里应用条件。一旦我进行第一个 JOIN 查询,就会从 HARD 中获取全部数据。
查询行数据
@"SELECT
t0.Id,
t1.Name,
t0.Per_Router,
t0.Prod_No,
t0.Rout_No,
t0.Seq,
t0.Type
FROM {0} t0 , "Routbom", "Hardware", "Material", "Rout");
这是我从你有限的解释中了解到的:
string sql = @"SELECT Id,Name,Per_Router,Prod_No,Rout_No,Seq,Type
from
(
Select t0.*, t1.Name as Name
from RoutBom t0
inner join Mat t1 on t0.Id = t1.Id
where t0.type = 2
union
Select t0.*, t1.Name as Name
from RoutBom t0
inner join Hard t1 on t0.Id = t1.Id
where t0.type = 1
union
Select t0.*, t1.Name as Name
from RoutBom t0
inner join Rout t1 on t0.Prod_no = t1.Id
where t0.type = 4 and Empty(Nvl(t0.id,''))
) tmp
";
DataTable tbl = new DataTable();
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\test\Data"))
using (OleDbCommand cmd = new OleDbCommand(sql, con))
{
con.Open();
tbl.Load(cmd.ExecuteReader());
}
// Do something with tbl
您改用 Linq 可能更容易。检查 Tom Brother 的 Linq To VFP 和 VFP Entity Framework.
这是另一种方法,也解决了并集问题:
void Main()
{
string sql = @"SELECT *,
Cast(icase(
type = '1', (select Name from Mat t1 where t0.Id = t1.Id),
type = '2', (select Name from Hard t1 where t0.Id = t1.Id),
empty(nvl(id,'')) and type='4', (select Name from Rout t1 where t0.Prod_No = t1.Id),
'') as c(100)) as Name
from RoutBom t0";
DataTable tbl = new DataTable();
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\Test\Data"))
using (OleDbCommand cmd = new OleDbCommand(sql, con))
{
con.Open();
tbl.Load(cmd.ExecuteReader());
}
// Do something with tbl
tbl.Dump(); // you said LinqPad above
}
首先,我建议您学习 JOIN 的 'standard' SQL 基础知识(非特定于 VFP)。您可以在以下位置找到很好的解释:Inner and Outer JOINs in SQL
然后将其应用于您的 table。
基本上,您将有 1 个 'parent' table 和 3 个 'child' table,它们通过 SQL 语法连接到 'parent'。
VFP SQL 语法与 'generic' SQL 语法略有不同,但在大多数情况下 'generic' 语法工作正常。
可能是这样的:
SELECT ROUTBOM.*,;
MAT.Name AS Mat_Name,;
HARD.Name AS Hard_Name,;
ROUT.Name AS Rout_Name;
FROM ROUTBOM;
LEFT JOIN Mat ON ROUTBOM.ID = MAT.ID;
LEFT JOIN Hard ON ROUTBOM.ID = HARD.ID;
LEFT JOIN Rout ON ROUTBOM.ID = Rout.ID;
WHERE < all whatever conditions >;
INTO CURSOR Results READWRITE
SELECT Results
BROWSE
请注意,这只是记下来并没有经过测试,但它是 'BASIC' SQL 语法,您应该在尝试将其应用到项目之前学习它。
也许您可能想去:www3schools - SQL SELECT syntax
祝你好运
我有 4 个 table(ROUTBOM、HARD、MAT、ROUT)。在主 table ROUTBOM 中,我有 ID、PROD_NO 和 TYPE 列。我必须根据 TYPE 和(ID 或 PROD_NO)select。条件如下。这可以用内部连接来实现吗 - 在连接之前有条件?
数据库是 FoxPro
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\test\Data"))
数据: ROUTBOM
id qty prod_no Type Name
20322 0.15000 2 ??? get name from HARD
2.00000 0066773 4 ??? get name from ROUT
37500 4.00000 2 ??? get name from HARD
29750 4.00000 1 ??? get name from MAT
困难TABLE
ID NAME
20322 H68NK0005
37500 HAS2-30XX-H HYBRID POWDER
垫子TABLE
ID NAME
29750 NEOPRENE (McMASTER 8694K61)
02125 SPRING STEEL STRIP .008'' X .50'' X 60''
溃败TABLE
ID NAME
0066773 L.V. DOOR ARC PROOF J4
000198 DEVEL. L.V. DOOR J4
需要输出
id qty prod_no Type Name
20322 0.15000 2 H68NK0005
2.00000 0066773 4 L.V. DOOR ARC PROOF J4
37500 4.00000 2 HAS2-30XX-H HYBRID POWDER
29750 4.00000 1 NEOPRENE (McMASTER 8694K61)
查询:
条件:
if id is not null and type 2 JOIN ROUTBOM.id with MAT.id to get the name of material
if id is not null and type 1 JOIN ROUTBOM.id with HARD.id to get the name of hadware
if id is empty and type 4 JOIN ROUTBOM.prod_no with ROUT.id to get the name of part
可以一次查询完成吗?我不知道必须在哪里应用条件。一旦我进行第一个 JOIN 查询,就会从 HARD 中获取全部数据。
查询行数据
@"SELECT
t0.Id,
t1.Name,
t0.Per_Router,
t0.Prod_No,
t0.Rout_No,
t0.Seq,
t0.Type
FROM {0} t0 , "Routbom", "Hardware", "Material", "Rout");
这是我从你有限的解释中了解到的:
string sql = @"SELECT Id,Name,Per_Router,Prod_No,Rout_No,Seq,Type
from
(
Select t0.*, t1.Name as Name
from RoutBom t0
inner join Mat t1 on t0.Id = t1.Id
where t0.type = 2
union
Select t0.*, t1.Name as Name
from RoutBom t0
inner join Hard t1 on t0.Id = t1.Id
where t0.type = 1
union
Select t0.*, t1.Name as Name
from RoutBom t0
inner join Rout t1 on t0.Prod_no = t1.Id
where t0.type = 4 and Empty(Nvl(t0.id,''))
) tmp
";
DataTable tbl = new DataTable();
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\test\Data"))
using (OleDbCommand cmd = new OleDbCommand(sql, con))
{
con.Open();
tbl.Load(cmd.ExecuteReader());
}
// Do something with tbl
您改用 Linq 可能更容易。检查 Tom Brother 的 Linq To VFP 和 VFP Entity Framework.
这是另一种方法,也解决了并集问题:
void Main()
{
string sql = @"SELECT *,
Cast(icase(
type = '1', (select Name from Mat t1 where t0.Id = t1.Id),
type = '2', (select Name from Hard t1 where t0.Id = t1.Id),
empty(nvl(id,'')) and type='4', (select Name from Rout t1 where t0.Prod_No = t1.Id),
'') as c(100)) as Name
from RoutBom t0";
DataTable tbl = new DataTable();
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\Test\Data"))
using (OleDbCommand cmd = new OleDbCommand(sql, con))
{
con.Open();
tbl.Load(cmd.ExecuteReader());
}
// Do something with tbl
tbl.Dump(); // you said LinqPad above
}
首先,我建议您学习 JOIN 的 'standard' SQL 基础知识(非特定于 VFP)。您可以在以下位置找到很好的解释:Inner and Outer JOINs in SQL
然后将其应用于您的 table。 基本上,您将有 1 个 'parent' table 和 3 个 'child' table,它们通过 SQL 语法连接到 'parent'。
VFP SQL 语法与 'generic' SQL 语法略有不同,但在大多数情况下 'generic' 语法工作正常。
可能是这样的:
SELECT ROUTBOM.*,;
MAT.Name AS Mat_Name,;
HARD.Name AS Hard_Name,;
ROUT.Name AS Rout_Name;
FROM ROUTBOM;
LEFT JOIN Mat ON ROUTBOM.ID = MAT.ID;
LEFT JOIN Hard ON ROUTBOM.ID = HARD.ID;
LEFT JOIN Rout ON ROUTBOM.ID = Rout.ID;
WHERE < all whatever conditions >;
INTO CURSOR Results READWRITE
SELECT Results
BROWSE
请注意,这只是记下来并没有经过测试,但它是 'BASIC' SQL 语法,您应该在尝试将其应用到项目之前学习它。
也许您可能想去:www3schools - SQL SELECT syntax
祝你好运