DBF - условное соединение с правильным синтаксисом - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть 4 таблицы (ROUTBOM, HARD, MAT, ROUT).В основной таблице ROUTBOM у меня есть столбцы ID, PROD_NO и TYPE.Я должен был выбрать на основе TYPE и (ID или PROD_NO).Условия ниже.Можно ли это сделать с помощью внутреннего соединения - с условием перед соединением?

База данных - 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

HARD TABLE

ID      NAME
20322   H68NK0005
37500   HAS2-30XX-H HYBRID POWDER

ТАБЛИЦА МАТОВ

ID      NAME
29750   NEOPRENE (McMASTER 8694K61)
02125   SPRING STEEL STRIP .008'' X .50'' X 60''

СТОЛ ДЛЯ МАРШРУТОВ

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");

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Сначала я бы порекомендовал вам изучить «стандартные» основы SQL (не специфичные для VFP) из JOIN.Вы можете найти довольно хорошее объяснение этого по адресу: Внутренние и внешние соединения в SQL

Затем примените это к своим таблицам.В основном у вас будет 1 «родительская» таблица и 3 «дочерние» таблицы, которые присоединяются к «родительскому» через синтаксис SQL.

Синтаксис VFP SQL немного отличается от «общего» синтаксиса SQL, но в большинстве случаев «общий» синтаксис работает нормально.

Может быть что-то вроде:

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

Обратите внимание, что это было просто записано и не проверено, но это синтаксис SQL "BASIC", который вы должны изучить, прежде чем пытаться применить его к проекту.,

Может быть, вы захотите перейти по адресу: www3schools - Синтаксис SQL SELECT

Удачи

0 голосов
/ 12 сентября 2018

Вот что я понимаю из вашего ограниченного объяснения:

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. Проверьте Linq To VFP и VFP Entity Framework от Tom Brother.

Это еще один способ сделать это, а также решить проблему объединения:

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
} 
...