SQL-根据条件从多个源之一获取值

SQL-根据条件从多个源之一获取值,sql,Sql,我有以下表格结构: 事务表 transactID TBarcode Ecode PAICID status 1 1234 E001 1 0 2 4567 E002 2 1 SELECT TransactionTable.TransactID, TransactionTable.TBarCode, TransactionTable.ECode,

我有以下表格结构:

事务表

transactID  TBarcode   Ecode  PAICID  status
1            1234      E001    1         0
2            4567      E002    2         1
SELECT  TransactionTable.TransactID,
        TransactionTable.TBarCode,
        TransactionTable.ECode,
        TransactionTable.PAICID,
        TransactionTable.Status,
        EmployeeMasterTable.Ename
FROM    TransactionTable
        LEFT JOIN UserMasterTable
            ON UserMasterTable.ECode = TransactionTable.ECode
            AND TransactionTable.Status = 0
        INNER JOIN EmployeeMasterTable
            ON EmployeeMasterTable.ECode = COALESCE(UserMasterTable.ECode, TransactionTable.ECode)
WHERE   TransactionTable.BarCode = '1234';
用户主表

Uid   Uname Ecode
1      jas   E001
2      biju   E002
Ecode        Ename
E001         Jaseem
E002         bijeesh
雇员主表

Uid   Uname Ecode
1      jas   E001
2      biju   E002
Ecode        Ename
E001         Jaseem
E002         bijeesh
TransactionTable.PAICD
UserMasterTable.Uid
是相同的

我正在搜索
TBarcde
(我指的是类似
的条件,其中Tbarcode=1234

如果
status
为0,则我需要与
TransactionTable.Ecode
相关的
Ename

如果
status
为1,则我想从
UserMasterTable.Ecode
的相应
PAICID
Ename中获取
Ename


如何为此编写存储过程?

您不需要存储过程。以下查询将满足您的需要:

它直接通过
UserMasterTable
EmployeeMasterTable
上加入
TransactionTable
,然后根据状态标准从适当的加入员工表中选择Ename

SELECT 
    t.*,
    CASE 
        WHEN t.status = 0 
            THEN e0.Ename 
        ELSE e1.Ename 
    END AS Ename
FROM TransactionTable AS t
LEFT JOIN EmployeeMasterTable AS e0
    ON t.Ecode = e1.Ecode
LEFT JOIN UserMasterTable AS u
    ON t.PAICID = u.Uid
LEFT JOIN EmployeeMasterTable AS e1
    ON u.Ecode = e1.Ecode
WHERE TBarcode = 1234
如果在存储过程中确实需要它,请参考DBMS的文档了解如何实现。可能是这样的

CREATE PROCEDURE MyProcedure (IN iTBarcode INT)
BEGIN
    SELECT 
        t.*,
        CASE 
            WHEN t.status = 0 
                THEN e0.Ename 
            ELSE e1.Ename 
        END AS Ename
    FROM TransactionTable AS t
    LEFT JOIN EmployeeMasterTable AS e0
        ON t.Ecode = e1.Ecode
    LEFT JOIN UserMasterTable AS u
        ON t.PAICID = u.Uid
    LEFT JOIN EmployeeMasterTable AS e1
        ON u.Ecode = e1.Ecode
    WHERE TBarcode = iTBarcode
END

您需要
LEFT JOIN
到UsermasterTable,将状态置于连接条件中,然后可以使用COALESCE内部连接EmployeeMasterTable,以便在UsermasterTable中有匹配项时使用该项中的ECode,否则使用TransactionTable中的ECode

transactID  TBarcode   Ecode  PAICID  status
1            1234      E001    1         0
2            4567      E002    2         1
SELECT  TransactionTable.TransactID,
        TransactionTable.TBarCode,
        TransactionTable.ECode,
        TransactionTable.PAICID,
        TransactionTable.Status,
        EmployeeMasterTable.Ename
FROM    TransactionTable
        LEFT JOIN UserMasterTable
            ON UserMasterTable.ECode = TransactionTable.ECode
            AND TransactionTable.Status = 0
        INNER JOIN EmployeeMasterTable
            ON EmployeeMasterTable.ECode = COALESCE(UserMasterTable.ECode, TransactionTable.ECode)
WHERE   TransactionTable.BarCode = '1234';

我是存储过程新手,,,所以我在想如何写这个??你说的“take”和“show”是什么意思?我会检查并让你知道,,,编辑以添加TBarcode条件并充实存储过程,同时执行第一个过程,在关键字“ELSE”附近显示错误语法。我现在已经删除了它,我误读了你的标准,找到了一个不需要案例陈述的解决方案好的创造性解决方案+1.