MSSQL条件连接条件

时间:2017-06-26 20:32:30

标签: sql sql-server sql-server-2008 tsql join

我在加入时遇到了一些麻烦,希望社区能够提供帮助。我试图在transtypeID列上连接两个表TRANSACTIONS和TRANSTYPES。很容易。但是,foreign_account列表示交易可以是国外的或国内的。事务类型可以是国外的也可以是国内的,并且在TRANSTYPES表中可以有多行。

我正在寻找一个尝试在ID上匹配TRANSACTIONS和TRANSTYPES的连接,并且在可能的情况下寻找foreign_account = foreign_account(x = x或null = null)。如果foreign_account上没有匹配项,那么它将使用匹配的transtypeID行,并且不会注意foreign_account列。

表格设置:

CREATE TABLE ##TRANSTYPES
        (transtypeID int,
        tt_name VARCHAR(50),
        foreign_account VARCHAR(5),
        additional_info VARCHAR(20))

INSERT INTO ##TRANSTYPES
    VALUES
    (1000,NULL,102.00),
    (1002, NULL, 103.00),
    (1002, 'x', 104.00),
    (1003, 'x', 105.00),
    (1003, 'x', 106.00), 
    (1003, NULL, 107.00),
    (1003, NULL, 108.00)
CREATE TABLE ##TRANSACTIONS
        (transtypeID int,
        foreign_account VARCHAR(5),
        balance DECIMAL(18,4))

INSERT INTO ##TRANSACTIONS
    VALUES  
        (1000,NULL,102.00 ),
        (1002, NULL, 103.00),
        (1002, 'x', 104.00),
        (1003, 'x', 105.00)

我从简单的加入开始,但我没有得到1003类型的交易。

SELECT *
FROM ##transtypes TT
FULL outer JOIN ##transactions TRN
    ON tt.transtypeid = trn.transtypeID 
WHERE
    (TRN.foreign_account = TT.foreign_account
    OR (TRN.foreign_account IS NULL AND tt.foreign_account IS NULL))

我觉得交叉申请是有序的,但我以前从未写过。关于如何正确地进行子查询,我正在撞墙。我试图在foreign_account列命令的TRANSTYPE表上选择前1名,但到目前为止还没有运气。

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

从transtype ID的连接开始。然后对你的行进行排名,只保持更好的匹配(即可用时相同的foreign_account):

Route::get('/', function () {
  return view('welcome');
});

Auth::routes();

/* assuming you don't need authentication on home page */
Route::get('/home', 'HomeController@index')->name('home');

//timeday Routes
Route::resource('timeday','TimedayController');

答案 1 :(得分:1)

您可以使用UNION ALL

SELECT  tt.tt_name,
    tt.additional_info, 
    trn.transtypeID,
    trn.foreign_account,
    trn.balance
FROM ##TRANSTYPES tt INNER JOIN ##TRANSACTIONS trn ON tt.foreign_account = trn.foreign_account

UNION ALL

SELECT  tt.tt_name,
    tt.additional_info, 
    trn.transtypeID,
    trn.foreign_account,
    trn.balance
FROM ##TRANSTYPES tt INNER JOIN ##TRANSACTIONS trn ON tt.transTypeID = trn.transTypeID
WHERE tt.foreign_account <> trn.foreign_account
OR (TRN.foreign_account IS NULL AND tt.foreign_account IS NULL)