我在加入时遇到了一些麻烦,希望社区能够提供帮助。我试图在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名,但到目前为止还没有运气。
提前谢谢你。
答案 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)